Copy. Paste. Customize.
- Create a slider or wall in the editor. The same image list is shared; each mode keeps its own design.
- Export All-in-one for HTML with CSS and JS included. Paste the complete snippet, including its template and script.
- Upload the exported image files. Use relative paths on your own website and public image URLs for CodePen.
- Add a custom class to the outer logo-flow element, then use the parts below for scoped styling.
<logo-flow class="my-logos" data-settings='{"mode":"slider","color":"hover","tiles":true,"radius":18,"size":48,"gap":24,"speed":40,"controlOnHover":true}'>
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
<img src="logos/brand.png" alt="Brand">
</a>
</logo-flow>This markup needs the runtime. Keep the CSS template and script from the editor export, or load both shared runtime files.
Try the details.
This example uses the same runtime as your export. The symbols are local demo graphics.
data-settings
A JSON object controls the component. Keys and enum values remain English in both languages. Use booleans and numbers, not their string equivalents.
| Key | Values | Purpose |
|---|---|---|
mode | "slider" | "wall" | Layout |
color | "original" | "grayscale" | "hover" | Color treatment |
tiles | true | false | Card backgrounds |
radius | 0–48 | Card radius in px |
size | 24–96 | Maximum logo height in px |
gap | 8–96 | Spacing in px |
background | "#ffffff" | Surface color, six-digit hex |
card | "#f5f4ef" | Card color, six-digit hex |
speed | 10–120 | Slider speed in px/s |
direction | "left" | "right" | Slider direction |
pause | true | false | Automatically pause on hover |
controlOnHover | true | false | Show pause button only on hover/focus |
columns | 0, 2–6 | Desktop wall columns; 0 = automatic |
mobileColumns | 1–3 | Wall columns below 481 px container width |
language | "en" | "de" | Language of the pause button and empty state |
Change settings after the page loads
const el = document.querySelector('.my-logos');
const settings = JSON.parse(el.dataset.settings || '{}');
settings.radius = 24;
settings.speed = 50;
el.dataset.settings = JSON.stringify(settings);The runtime observes data-settings and the light-DOM image list. If you set el.config directly, it becomes the source of truth; update that property for later changes.
Classes inside. Parts outside.
LogoFlow renders inside a Shadow DOM. Page CSS such as .my-logos .item cannot reach those internal elements. Use ::part(...) from your page stylesheet, or edit the CSS template in an All-in-one export.
| Internal class | Public part | Role |
|---|---|---|
.surface | surface | Background, state classes, component padding. |
.viewport | viewport | Clips the moving row. |
.track | track | Animated track; slider only. |
.group | group | One sequence plus repeated copies. |
.wall | wall | Static responsive grid; wall only. |
.item | item / tile | Full clickable card when a URL is present. |
.item img | logo | The image itself, fitted without distortion. |
.control | control | Native pause/play overlay, slider only. |
.control-icon | control-icon | Inline SVG pause/play symbol. |
.control-label | control-label | Text label next to the control icon. |
State and treatment classes
.tiles: card backgrounds enabled..grayscale,.hover,.original: logo color treatment..controls-hover: pause button appears on hover or keyboard focus..is-paused: manually paused..still: reduced-motion layout..duplicate: loop copies, hidden from screen readers and keyboard navigation, still clickable.
These classes are generated state. Set the matching data-settings values instead of adding internal classes to the outer element.
A few useful CSS recipes.
.my-logos::part(tile) {
border: 1px solid #d8dfcf;
box-shadow: 0 4px 16px #00000008;
}
.my-logos::part(control) {
border-radius: 12px;
background: #20211e;
color: #ffffff;
}
.my-logos::part(logo) {
opacity: .9;
}Use the editor settings for radius, spacing, colors and columns. The runtime writes these variables on the surface element. To deliberately override a variable from outside, target the surface part with !important.
.my-logos::part(surface) {
--lf-background: #f7f8f4 !important;
--lf-card: #ffffff !important;
}Common variables: --lf-background, --lf-card, --lf-ink, --lf-radius, --lf-size, --lf-gap and --lf-width. At narrow container widths, the runtime caps image size and spacing; mobile wall columns are independent of viewport width.
Files, links and fonts.
Image sources are separate files, never Base64 in the generated image markup. The ZIP preserves selected crops and original filenames; duplicate names receive a numbered suffix. A link wraps the whole tile, including padding.
No custom font in exports. The slider CSS defines no font family, loads no font file and includes no Font Awesome. Text inherits the destination page font. Font sizes and weights can still be used for the small controls. Font Awesome belongs only to the landing pages and editor.
After modifying logo-slider.js or logo-slider.css, run node build-embed.mjs to regenerate the All-in-one sources. After changing translations, run node build-pages.mjs. Before publishing, run node configure.mjs with your real public base URL.
When something looks off.
Only broken images or plain text?
Paste the full All-in-one code, including template and script. Check that img src URLs are reachable. CodePen needs public image URLs, not your local logos/ folder. Shared mode requires both runtime files to be public.
My CSS class has no effect.
Classes inside the component are behind its Shadow DOM boundary. Add your own class to logo-flow and target an exposed ::part, or edit the exported CSS template.
Why is the pause button missing?
Walls never show it. Sliders hide it for reduced-motion preferences. With controlOnHover enabled it appears on hover or visible keyboard focus; touch devices keep it available.