import { CSSProperties } from 'react'; import { ChatBgVariants } from './types'; // chevron — refined woven-upholstery zigzag. // // The motif is a continuous, crisp chevron built to read as *textured fabric* // rather than flat stripes. The zigzag threads themselves are drawn with a // tiny inline-SVG tile (guaranteed geometrically seamless — the "V" path exits // each tile edge exactly where the next tile's path enters, both horizontally // and vertically). Over that, layered CSS gradients add the premium feel: // • a soft light→shade sweep across the weave gives each band an embossed, // woven cross-section (catches light on one diagonal face, shade on the // other); // • a faint two-tone wash alternates the tint of successive chevron rows for // an interlocked-yarn look; // • a gentle centre lift + corner vignette settle the field so text always // sits over the calmer middle. // // SEAMLESS TILING // The SVG is a WxH tile whose path is one full zigzag wave: it starts at the // left edge, dips to the vertex, rises to the right edge at the SAME y it // started — so horizontally each tile's end meets the next tile's start with no // step. Two stacked strokes (offset by H) fill the vertical repeat, and the // tile height equals the row pitch, so vertical stacking is seamless too. The // gradient overlays are non-repeating (100% 100%) or share the SVG's tile // width, so none of them introduce a seam. // // Everything sits at low alpha (~0.03–0.11) so the pattern is felt, not read: // crisp message text stays comfortably WCAG-AA in both themes. // One zigzag wave, 40px wide × 20px tall. Path enters at (0,4), dips to the // vertex at (20,16), climbs back to (40,4) — identical entry/exit y => seamless // horizontal repeat. A second copy shifted +10 in y keeps a soft double thread. const svg = (stroke: string, faint: string) => 'url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20' + 'width%3D%2240%22%20height%3D%2220%22%3E' + `%3Cpath%20d%3D%22M0%204%20L20%2016%20L40%204%22%20fill%3D%22none%22%20stroke%3D%22${stroke}%22%20stroke-width%3D%223%22%2F%3E` + `%3Cpath%20d%3D%22M0%2014%20L20%2026%20L40%2014%20M0%20-6%20L20%206%20L40%20-6%22%20fill%3D%22none%22%20stroke%3D%22${faint}%22%20stroke-width%3D%222%22%2F%3E` + '%3C%2Fsvg%3E")'; const dark: CSSProperties = { backgroundColor: 'oklch(0.20 0.022 260)', backgroundImage: [ // 1. The zigzag threads — muted indigo/slate, main + fainter under-thread. svg('oklch(0.55 0.05 265 %2F 0.16)', 'oklch(0.50 0.045 262 %2F 0.07)'), // 2. Woven emboss — a soft diagonal light→shade sweep across the weave so // the bands catch light on one face and fall to shade on the other. 'linear-gradient(135deg, oklch(0.62 0.05 265 / 0.05) 0%, transparent 45%, transparent 55%, oklch(0.14 0.02 260 / 0.06) 100%)', // 3. Two-tone weft — a whisper shade on alternate chevron rows. 'repeating-linear-gradient(0deg, oklch(0.50 0.04 258 / 0.035) 0px, oklch(0.50 0.04 258 / 0.035) 20px, transparent 20px, transparent 40px)', // 4. Tonal wash — cool centre lift for gentle depth. 'radial-gradient(ellipse 90% 75% at 50% 42%, oklch(0.26 0.03 262 / 0.40) 0%, transparent 60%)', // 5. Vignette — feather corners into deeper charcoal-blue. 'radial-gradient(ellipse 120% 130% at 50% 45%, transparent 60%, oklch(0.15 0.02 260 / 0.55) 100%)', ].join(','), backgroundSize: '40px 20px, 100% 100%, 40px 40px, 100% 100%, 100% 100%', }; const light: CSSProperties = { backgroundColor: 'oklch(0.965 0.006 85)', backgroundImage: [ // 1. The zigzag threads — soft dusty-blue, main + fainter under-thread. svg('oklch(0.55 0.05 255 %2F 0.14)', 'oklch(0.52 0.045 255 %2F 0.06)'), // 2. Woven emboss — diagonal light→shade sweep for a knit-fabric surface. 'linear-gradient(135deg, oklch(0.99 0.008 85 / 0.06) 0%, transparent 45%, transparent 55%, oklch(0.55 0.05 255 / 0.05) 100%)', // 3. Two-tone weft — faint alternating-row shade. 'repeating-linear-gradient(0deg, oklch(0.52 0.04 255 / 0.03) 0px, oklch(0.52 0.04 255 / 0.03) 20px, transparent 20px, transparent 40px)', // 4. Tonal wash — warm paper highlight through the reading centre. 'radial-gradient(ellipse 90% 75% at 50% 42%, oklch(0.99 0.008 85 / 0.55) 0%, transparent 60%)', // 5. Vignette — settle corners into a slightly deeper dusty tone. 'radial-gradient(ellipse 120% 130% at 50% 45%, transparent 60%, oklch(0.91 0.012 250 / 0.40) 100%)', ].join(','), backgroundSize: '40px 20px, 100% 100%, 40px 40px, 100% 100%, 100% 100%', }; export const chevron: ChatBgVariants = { dark, light };