Skip to content

Logger Extension

Development extension that logs all carousel state changes, lifecycle events, and configuration to the console for easy debugging, inspection, and extension development. Can also be used as a replacement for the onChange parameter for more advanced state tracking and side effects.

Usage

js
import { MotionRail } from "motionrail";
import { Logger } from "motionrail/extensions/logger";
import "motionrail/style.css";

const carousel = new MotionRail(element, {
  extensions: [
    Logger({
      // Optional hooks
      onInit: (carousel, state) => {
        // custom logic on init
      },
      onUpdate: (carousel, state) => {
        // custom logic on update
      },
      onDestroy: (carousel, state) => {
        // custom logic on destroy
      },
      // Control console output (default: true)
      outputToConsole: true,
    }),
  ],
});

Purpose

The Logger extension is a development tool that logs carousel state and lifecycle events to the console. It's useful for:

  • Debugging: Understanding when events fire
  • State inspection: Seeing current carousel state
  • Extension development: Watching the lifecycle flow
  • Testing: Verifying behavior changes

API

ts
Logger(options?: {
  onInit?: (carousel, state) => void;
  onUpdate?: (carousel, state) => void;
  onDestroy?: (carousel, state) => void;
  outputToConsole?: boolean; // default: true
}): MotionRailExtension
  • onInit: Called after MotionRail initializes (after logging)
  • onUpdate: Called after each state update (after logging)
  • onDestroy: Called after MotionRail is destroyed (after logging)
  • outputToConsole: Set to false to silence all logger output

What It Logs

If outputToConsole is true, the logger outputs messages for all extension lifecycle hooks:

  • onInit: When the carousel is initialized
  • onUpdate: When the carousel state updates
  • onDestroy: When the carousel is destroyed

State Information

Each update logs the current state:

js
{
  index: 0,           // Current slide index
  itemsCount: 5,      // Total number of items
  columns: 1,         // Columns per view
  gap: '16px',        // Gap between items
  isPlaying: true     // Autoplay status
}

Example Output

[MotionRail Logger] onInit
[MotionRail Logger] onUpdate {
  index: 0,
  itemsCount: 5,
  columns: 1,
  gap: '16px',
  isPlaying: true
}
[MotionRail Logger] onUpdate {
  index: 1,
  itemsCount: 5,
  columns: 1,
  gap: '16px',
  isPlaying: true
}

Complete Example

js
import { MotionRail } from "motionrail";
import { Logger } from "motionrail/extensions/logger";
import "motionrail/style.css";

const carousel = new MotionRail(document.getElementById("carousel"), {
  autoplay: true,
  delay: 3000,
  breakpoints: [
    { minWidth: "0px", columns: 1 },
    { minWidth: "768px", columns: 2 },
  ],
  extensions: [
    Logger({
      outputToConsole: true,
      onUpdate: (carousel, state) => {
        // custom update logic
      },
    }),
  ],
});

UMD (CDN)

html
<link
  rel="stylesheet"
  href="https://unpkg.com/motionrail@latest/main/dist/style.css"
/>

<div data-motionrail id="carousel">
  <!-- carousel items -->
</div>

<script src="https://unpkg.com/motionrail@latest/main/dist/motionrail.umd.js"></script>
<script src="https://unpkg.com/motionrail@latest/extensions/logger/dist/logger.umd.js"></script>
<script>
  const carousel = new MotionRail(document.getElementById("carousel"), {
    autoplay: true,
    delay: 3000,
    breakpoints: [
      { minWidth: "0px", columns: 1 },
      { minWidth: "768px", columns: 2 },
    ],
    extensions: [MotionRail.Logger()],
  });
</script>

When to Use

Development

Perfect for development when you need to:

  • Verify event timing
  • Debug state changes
  • Understand carousel behavior
  • Test responsive breakpoints

Production

Remove the logger in production to avoid console clutter:

js
const extensions = [];

// Only add logger in development
if (import.meta.env.DEV) {
  extensions.push(Logger());
}

const carousel = new MotionRail(element, {
  extensions,
});
// Or, silence output in production:
const carousel = new MotionRail(element, {
  extensions: [Logger({ outputToConsole: import.meta.env.DEV })],
});

## Conditional Loading

```js
// Only in development
const carousel = new MotionRail(element, {
  extensions: [process.env.NODE_ENV === "development" && Logger()].filter(
    Boolean,
  ),
});

With Multiple Extensions

js
import { Arrows } from "motionrail/extensions/arrows";
import { Dots } from "motionrail/extensions/dots";
import { Logger } from "motionrail/extensions/logger";

const carousel = new MotionRail(element, {
  extensions: [
    Arrows(),
    Dots(),
    Logger({ outputToConsole: true }), // Logs events from all extensions
  ],
});

TypeScript

ts
import { MotionRail } from "motionrail";
import { Logger } from "motionrail/extensions/logger";

const carousel = new MotionRail(element, {
  extensions: [Logger()],
});

Next Steps