import { CofferedCeiling, CorniceRing, FlutedShaft, HangingFixture, RoundArch, ShaftBase, TuscanCapital, WallBand, } from './primitives'; import { shade, useBayZ, useCorners, useRepeat, useWallClearance, type PeriodProps, } from './geometry'; /** * Roman atrium — Ancient / Classical. * * Engaged Tuscan half-columns on a bay rhythm carry a compressed but complete * entablature (architrave, plain frieze, dentil course, projecting cornice). * Below the frame line the walls carry the Pompeian red socle of a Fourth Style * room; a bronze polycandelon hangs over the centre in place of ceiling lights. */ export function RomanAtriumDetails({ room, trim }: PeriodProps) { const bays = useBayZ(room.depth, room.halfD, 4.0, 9); const corners = useCorners(room.halfW, room.halfD, 0.1); const stone = '#e6dcc6'; const shadowStone = shade(stone, -0.14); const socle = '#7c3227'; const dentils = useRepeat(room.depth, 0.46, 30); return ( {/* Pompeian socle with a black skirting course */} {(['left', 'right', 'back'] as const).map((wall) => ( ))} {/* Engaged half-columns on the bay rhythm */} {bays.map((z, i) => ( {[-1, 1].map((side) => ( ))} ))} {/* Entablature: architrave, frieze and dentils along the colonnaded walls */} {(['left', 'right'] as const).map((wall) => ( {dentils.map((z, i) => ( ))} ))} {/* Projecting cornice returning around the whole room */} {/* Corner antae — square pilasters closing the order at each corner */} {corners.map(([x, z], i) => ( ))} ); } /** * Florentine palazzo — Early Renaissance. * * Brunelleschi's grammar: flat pietra serena pilasters set against lime plaster, * a blind arcade of semicircular arches springing between them, glazed roundels * in the spandrels, and a painted-and-beamed quattrocento ceiling. */ export function QuattrocentoDetails({ room, trim, windows }: PeriodProps) { const bays = useBayZ(room.depth, room.halfD, 3.8, 9); const clearLeft = useWallClearance(windows, 'left'); const clearRight = useWallClearance(windows, 'right'); const serena = '#8b8f8a'; const serenaLight = shade(serena, 0.16); const step = bays.length > 1 ? bays[1] - bays[0] : room.depth / 2; return ( {/* Pietra serena dado with a moulded cap */} {(['left', 'right', 'back'] as const).map((wall) => ( ))} {/* Flat pilasters carrying the arcade */} {bays.map((z, i) => ( {[-1, 1].map((side) => ( {/* Simplified Corinthian capital */} ))} ))} {/* Blind arcade between the pilasters, plus a roundel in each spandrel */} {bays.slice(0, -1).map((z, i) => { const mid = z + step / 2; return ( {([-1, 1] as const).map((side) => ( {/* Glazed tondo, only where no window claims the bay */} {(side < 0 ? clearLeft : clearRight)(mid, 0.22) && ( )} ))} ); })} {/* Painted beam ceiling over the arcade */} ); } /** * Roman palazzo — High Renaissance. * * Bramante's cinquecento order: paired fluted Corinthian pilasters on a wide * bay, a full marble entablature, panelled dado, and a rosetted coffer field * modelled on the Pantheon soffit. */ export function CinquecentoDetails({ room, trim }: PeriodProps) { const bays = useBayZ(room.depth, room.halfD, 5.2, 6); const marble = '#efe9dd'; const grey = shade(marble, -0.16); return ( {/* Panelled marble dado */} {(['left', 'right', 'back'] as const).map((wall) => ( ))} {/* Paired fluted pilasters */} {bays.map((z, i) => ( {[-1, 1].map((side) => [-0.19, 0.19].map((dz) => ( )) )} ))} {/* Full entablature on the pilastered walls, cornice all round */} {(['left', 'right'] as const).map((wall) => ( ))} ); }