shadcn.io is not affiliated with official shadcn/ui
Diagonal Split Release Notes Login Block for React
A split sign-in page for a product analytics tool: the form beside a What's new list of three releases with a slanted edge, each release a disclosure that opens its detail, and one GitHub row.
Installation
Overview
Show what's new while people sign in with this diagonal split login block for React with Base UI. It's the sign-in of Vectorloft, a product analytics tool: the page's two side rails run its full height and one band crosses the screen between two rules. The form sits at the end of the band: a Continue with GitHub Button with a two-letter tile in place of a logo, an "or" rule, an email Input and a Password Input in their Fields, and the Shine Button, the only colored control. At the start, on a tinted wedge whose end edge runs on a slant, with a hairline along it and a plus mark where it meets each band rule, "What's new" lists three recent releases, each a Collapsible that opens its detail under a version and a fixed date. The wedge and its hairline mirror under right-to-left; the text doesn't. Sending the form checks both fields and moves focus to the first problem; a good press shows a spinner, then the result in the form's own space. On a phone the release list is gone and the form takes the screen. It's built from Collapsible, Button, Field, Input, Password Input, Shine Button and Guides, with a CSS entrance only. For a changelog beside a sign-in.
FAQ
What happens when I sign in, and what stays in the page?
Nothing leaves the page. Sign in waits under a spinner for less than a second, then shows "You're signed in" with the address you typed, and a polite status message says nothing was sent; Sign out brings the form back with your email still filled in. Continue with GitHub shows where a real one would send you ("Nothing opens in this demo") with a way back. To wire it for real, post the email and password to your auth endpoint where the code says so, keep the busy state until it answers, then redirect, or show its error under the field it concerns, and point the provider row at your OAuth redirect. The releases are typed data you replace with your own changelog.
How is the slanted edge drawn, and does it work in right-to-left?
Two decorative layers behind the text: a tinted block clipped with clip-path into a wedge, and a one-line SVG for the hairline along the slant, with vector-effect: non-scaling-stroke so it stays one pixel at any height. A small box holds a plus mark at each end of the slant. Each layer carries rtl:-scale-x-100, so in a right-to-left layout the wedge, the hairline and the marks mirror and the slant still meets the band's rules; the text and the chevrons are not flipped by that, they follow the page direction on their own.
How do the releases open?
Each release is its own disclosure, so any number can be open: the first starts open, and the open ones are kept in one list in the component. A trigger is a real button inside an h3, with the title, the version and the date; pressing it or Enter or Space toggles its detail, and the chevron turns. The dates are fixed ISO days spelled out in UTC (2026-10-06 as Oct 6, 2026), so they read the same on the server and in every time zone. A closed release's detail stays in the page, hidden.
Why is the Sign in button never disabled?
A disabled button can't explain itself, and keyboard users can't reach it. Here it stays enabled: pressing it with an empty or malformed email, or no password, marks those fields invalid, writes one sentence under each and moves focus to the first, which reads its problem out. Typing clears that field's problem. The browser's own validation bubbles are turned off with noValidate, so the messages look the same in every browser, and each field keeps a line for its problem even when there is none, so a problem never pushes the page.
Why is the form first in the page when the side comes first on screen?
The form comes first in the markup, so Tab order and the reading order for a screen reader start with the sign-in and the heading, and on a phone, where the side is gone, nothing has to be reordered. The side is placed at the start of the band with two grid classes (lg:col-start-1 lg:row-start-1) and the divider is its end border. It follows the page direction, so in a right-to-left layout the side sits at the right.
What do phone visitors see?
The release list and its wedge are hidden below 1024 px (max-lg:hidden), so a phone shows the product's mark, the heading, the GitHub row, the form and the Sign in button, which ends on the first screen. The list is a nice-to-have, so a phone user loses nothing needed to sign in.
Related
- Pro
Split Product Sketch Login
Split with a panelA split sign-in page for a grocery delivery service: the form at the end beside a drawn sketch of the product (a basket, a delivery slot and a total in an inset frame), with Remember me and a simulated sign-in.
- Pro
Benefits Accordion Login
Split with a panelA split sign-in page for a freelancer back office: the form with Remember me beside five benefits as an accordion, one open at a time and the first open to start, with ruled rows.
- Pro
Feature Tour Login
Split with a panelA split sign-in page for a spreadsheet that works like a database: the form beside a wide three-tab tour (Boards, Timeline, Reports), each tab a drawn greyscale view of one table and a sentence.
- Pro
Social Buttons Login
SSO and providersA full-height provider-first sign-in page for a photo-sharing app: four hairline rows for Google, GitHub, Apple and Microsoft with a Last used badge that moves, and an email form that opens in place.
- Pro
Staggered Reveal Sign In Login
Split with a panelA sign-in page that opens one row at a time: a large heading at the start, the form behind a divider at the end, a valid email opens the password row, eight characters open Keep me signed in, and the button names the next step.
- Pro
App Download Login
Split with a panelA reverse split sign-in page for a running tracker: a real QR code of a download link with an iOS and Android switch that re-encodes it, a copyable link, and the sign-in form beside it. On a phone the code gives way to a Get the app link.