Lab
What can a Steelbridge interface include?
These are working patterns for custom websites and web applications: the controls, panels, and layout techniques a business site actually uses. Each one is a demo, not a client result. Motion follows the system setting for reduced motion.
Sliders
A visitor should be able to move through a set of offers, compare two states, or set a number without a new page.
Scroll-snap carousel
Touch, trackpad, and keyboard all move the same row. Useful for a few projects, products, or testimonials when you have something real to show. This one does not autoplay.
Swipe and scroll work without JavaScript. The buttons and arrow keys are added when the section loads.
View code
Before and after
A comparison slider lets someone drag between two versions of a layout. Shops use it for a renovation, a product, or a homepage rewrite. Drag the handle, click anywhere on the picture, or use the arrow keys when the control is focused.
The range sits on the picture, so a drag, a click, and the arrow keys move one clip. JavaScript writes that value to a CSS variable and keeps the pointer for the whole drag, including past the edges. The divider uses the same variable, so it stays on the clip when the page is resized. The handle stays inside the picture at 0% and 100%, so it can be dragged back. A vertical swipe still scrolls the page.
View code
Price range
A budget control on a quote form, so the first conversation starts closer to the real scope. The amounts here are positions on a sample control. They are not Steelbridge prices.
View code
Collapsing containers
Long pages get easier to scan when the detail is one click away and the summary stays visible.
Accordion
Native disclosure widgets for FAQs, service details, and shipping rules. They work without a script, and the headings stay in the page outline.
The name attribute keeps one item open where the browser supports exclusive accordions. Elsewhere, several can stay open.
View code
Animated height
The same disclosure, with the panel height easing open where the browser can interpolate it. Helpful when a sudden jump makes a long FAQ feel brittle. Reduced motion gets the instant native open.
Height animation uses ::details-content and interpolate-size. Browsers without them still open and close the panel.
View code
Expandable cards
A grid of summaries that open in place. Useful for a services overview, a team list, or a set of locations when each one needs a paragraph but not its own scroll.
View code
Read more
A clamped paragraph for a bio, a product description, or a case note that should preview before it expands. The full text is available immediately if JavaScript does not run.
View code
Flyouts
Panels that open over the page: filters, menus, help, search, notices, and a focused dialog. Escape closes the modal ones and returns focus to the button that opened them.
Off-canvas drawer
Filters, account links, or a mobile menu can slide in from the edge instead of sending the visitor to another page. Check a category and the sample list beside the button updates.
The drawer is a dialog. Without JavaScript the sample list still shows every row.
View code
Mega menu
A wide menu for a site with several services and places. It opens from a disclosure, so keyboard users reach every link, and it stacks on a narrow screen.
Arrow keys move between the links after the section’s script loads. Tab works either way.
View code
Popover and tooltip
A short explanation next to a label, a delivery note, or a definition. The button is in the tab order, so the note is not hover-only.
The Popover API hides the fallback disclosure. Anchor positioning, where supported, places the note under the button. Other browsers still open the note, usually centered on the page.
View code
Command palette
A keyboard search for sites with a lot of pages, or for an application with many actions. On this page it jumps to a demo. Press Ctrl+K or Command+K, or use the button.
View code
Toasts
A quiet confirmation after a copy, a save, or a filter change. It should not be the only place important information appears. This button shows a sample notice and does not send anything.
View code
Modal dialog
A focused question, a short form, or a confirm step. The page behind it is inert until the dialog closes. This sample does not submit a message. The contact form does.
View code
Motion
Motion should explain a change, not decorate every scroll. These run when the browser allows motion and the feature exists. Otherwise the content just sits there, readable.
Scroll-driven reveal
Cards fade and rise as they enter the screen, one after another, so a process or a feature list does not arrive as a single block. Scroll this list and each step comes in on its own.
Scroll down and a card fades in. Scroll back up and it fades out. Scroll down again and it plays again. Where scroll-driven animation exists, that follows the scroll position in both directions. Otherwise the visible state is added as a card enters and removed as it leaves. Reduced motion leaves every card in place.
View code
View transition
A grid that opens into a single detail without a full reload. Product catalogs and project indexes use this so the thing you clicked is still the thing on screen.
Where document.startViewTransition exists, the tile morphs. Elsewhere the layout swaps immediately. The sentences stay visible either way.
View code
Magnetic button
A primary action can lean toward the pointer on a desktop, which makes a sparse hero feel responsive. Keyboard and touch users get an ordinary button. This one goes to the contact form.
The pull only runs for a fine pointer when reduced motion is off. It uses the Web Animations API so it does not need inline styles.
View code
SVG line draw
A mark, a route, or a process line can draw as it enters the screen. It is a signature moment, and one is enough.
Scroll down and the line draws. Scroll up and it undraws. Scroll down again and it draws again. Where scroll-driven animation exists, that follows the scroll position in both directions, with no fill mode. Otherwise a class is added as the line enters and removed as it leaves. Reduced motion shows the finished line.
View code
Gradient field
A small canvas behind a hero or an empty state, drawn without WebGL. It pauses when the demo is off screen, and it paints a still frame when reduced motion is on.
View code
Text split and morph
A headline can arrive letter by letter, or swap one word for the next, when the words are real. The readable sentence is in the page for assistive technology. The split line is decorative.
The word change is a button, so it does not depend on a timer. Letters rise as the line enters and settle back as it leaves. Scrolling back runs that again.
View code
Rendering
The same component has to read clearly on a phone and on a wide monitor, and a long page has to stay light.
Container query and device frame
This card follows the frame it sits in, not the window. Switch between phone and desktop. On a desktop you can also drag the frame’s corner. A sidebar, a card grid, or an embedded preview can reflow this way.
Container queries are widely supported. The desktop switch uses :has(). The resize handle is plain CSS.
View code
Fluid type
Headlines scale with the window and stop at a minimum and a maximum, so a phone does not get a desktop-sized title and a monitor does not get a billboard.
View code
Responsive image
Drag the grip, or use the slider. That changes the frame, and the browser downloads a width that fits it, from sizes and srcset. The format is chosen once, by what the browser supports: AVIF first, then WebP, with JPEG as the fallback. Dragging does not switch the format. The control below can leave a single format in the picture, so WebP or JPEG can be the one that loads. Under about 520 pixels the frame uses a tighter crop of the same photograph.
View code
Lazy list
A catalog of 1,000 rows. Scroll the box. A sentinel at the end of the loaded range asks for the next rows, which show up as skeletons and then fill in. Rows that leave the box are removed, so the document never holds the whole list. The counter is how many row elements are actually in the document. Rows mounted just outside the box use content-visibility: auto, which lets the browser skip painting them until they get close.
View code
Skeleton
While a card is loading, a placeholder holds the space so the page does not jump. Play it to see the pattern. Nothing is fetched from a server.
View code
Windowed list
An application list with hundreds of rows should keep only a slice in the document. This demo windows 500 sample rows. The buttons and the range move the window. The rows are placeholders, not a catalog.
View code
Sticky table
Schedules, comparisons, and rate cards need a header that stays put while the body scrolls. On a phone the table scrolls sideways, and the first column stays pinned so the row still has a name.
View code
Theme
A light and dark pair for readers who want it, stored for the next visit to this page. The rest of the site stays on the paper palette. Contrast stays with the same copper and ink relationship, flipped.
View code
Reduced motion
If the system asks for less motion, transitions, the line draw, the scroll reveals, the magnetic pull, and the canvas animation stay still. A card like this can be a call to action: it comes in to reveal an offer. With reduced motion on, the offer is still there, without the movement. The dot travels the track as this demo moves through the screen, and it comes back when you scroll up.
View code
Use one of these on a real project
Tell us what the interface has to do. The scope says which of these patterns belong in it.