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) => (
))}
);
}