1 GitHub star = 1 new component.

Star the repo
Layoutlayoutdividerdiagonalslantseparator

Diagonal Section Divider

Diagonal angled section divider creating energetic page transitions.

Live Preview

Usage

Copy and paste this code into your React component:

tsx
import { DiagonalSectionDivider } from 'react-component-kit-ui/layout';

<DiagonalSectionDivider angle="slant-down" fill="var(--c-bg-subtle)" height={60} />

Manual Installation

If you are not using the npm package, create a new file and paste the following code: src/components/DiagonalSectionDivider.tsx + DiagonalSectionDivider.css:

DiagonalSectionDivider.tsx
'use client';

import type { CSSProperties } from 'react';
import './DiagonalSectionDivider.css';

/** class:list β†’ className */
function cx(...args: unknown[]): string {
  const out: string[] = [];
  const walk = (v: unknown) => {
    if (!v) return;
    if (typeof v === 'string' || typeof v === 'number') out.push(String(v));
    else if (Array.isArray(v)) v.forEach(walk);
    else if (typeof v === 'object') for (const [k, on] of Object.entries(v as Record<string, unknown>)) if (on) out.push(k);
  };
  args.forEach(walk);
  return out.join(' ');
}

/** "a: b; --c: d" β†’ style object */
function st(css: string | undefined): CSSProperties {
  const o: Record<string, string> = {};
  for (const decl of String(css ?? '').split(';')) {
    const i = decl.indexOf(':');
    if (i < 0) continue;
    const k = decl.slice(0, i).trim();
    if (k) o[k.startsWith('--') ? k : k.replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = decl.slice(i + 1).trim();
  }
  return o as CSSProperties;
}

/**
 * DiagonalSectionDivider β€” Angled SVG/clip-path section divider creating fluid diagonal page transitions.
 * 
 * @param {'top' | 'bottom'} position - Attachment position. Default is 'bottom'.
 * @param {'left-to-right' | 'right-to-left'} direction - Slant angle direction. Default is 'left-to-right'.
 * @param {string} height - Height of the diagonal incline in pixels. Default is '60px'.
 * @param {string} fillColor - Fill color for the divider polygon. Default is '#050505'.
 */
export interface DiagonalSectionDividerProps {
  position?: 'top' | 'bottom';
  direction?: 'left-to-right' | 'right-to-left';
  height?: string;
  fillColor?: string;
}

export function DiagonalSectionDivider({
  position = 'bottom',
  direction = 'left-to-right',
  height = '60px',
  fillColor = '#050505',
}: DiagonalSectionDividerProps) {
  const isLtr = direction === 'left-to-right';
  const points = isLtr
    ? position === 'bottom' ? '0,100 100,0 100,100' : '0,0 100,0 100,100'
    : position === 'bottom' ? '0,0 0,100 100,100' : '0,0 100,0 0,100';
  return (
    <>
      <div className={cx(['diagonal-divider', `diagonal-divider--${position}`])} style={st(`--div-height: ${height}; --div-color: ${fillColor};`)} aria-hidden="true" data-rk-9b90ea="">
        <svg viewBox="0 0 100 100" preserveAspectRatio="none" className="diagonal-divider__svg" data-rk-9b90ea="">
          <polygon points={points} fill={fillColor} data-rk-9b90ea="" />
        </svg>
      </div>
    </>
  );
}

export default DiagonalSectionDivider;
DiagonalSectionDivider.css
/* DiagonalSectionDivider β€” ported from astro-component-kit (layout/DiagonalSectionDivider.astro) */

.diagonal-divider:where([data-rk-9b90ea]) {
  position: relative;
  width: 100%;
  height: var(--div-height);
  overflow: hidden;
  line-height: 0;
  pointer-events: none;
  z-index: 2;
}

.diagonal-divider--bottom:where([data-rk-9b90ea]) {
  margin-bottom: calc(-1 * var(--div-height));
}

.diagonal-divider--top:where([data-rk-9b90ea]) {
  margin-top: calc(-1 * var(--div-height));
}

.diagonal-divider__svg:where([data-rk-9b90ea]) {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
}

Quick Info

Category
Layout
Filename
DiagonalSectionDivider.tsx
Dependencies
None β€” pure React + CSS
Tags
layoutdividerdiagonalslantseparator