// NGIS website — shared decorative system // Disciplined to the brand's primary pair (red + navy) with gold as a sparing // metallic accent. Provides background patterns, ring motifs (echoing the crest // ring) and layered photo frames (the prospectus's stacked-rectangle look). // ---- Crest quadrant palette ------------------------------------------------ // The four crest quadrant colors, in reading order. Used to cycle accents // across cards/tiles/borders instead of the plain red/navy pairing, wherever // a section needs more than one accent color. const CREST = { green: '#2FA84F', // top-left quadrant navy: '#16305C', // top-right quadrant sky: '#2AACE2', // bottom-left quadrant gold: '#F4B400', // bottom-right quadrant }; const CREST_CYCLE = [CREST.green, CREST.navy, CREST.sky, CREST.gold]; // ---- Background patterns (pure CSS, no asset loading) -------------------- const PATTERNS = { // faint dot grid for light surfaces dotsLight: { backgroundImage: 'radial-gradient(var(--ink-200) 1.1px, transparent 1.2px)', backgroundSize: '24px 24px', }, // dot grid for navy surfaces dotsNavy: { backgroundImage: 'radial-gradient(rgba(255,255,255,0.09) 1.1px, transparent 1.2px)', backgroundSize: '24px 24px', }, // fine engineering grid for navy surfaces gridNavy: { backgroundImage: 'linear-gradient(rgba(255,255,255,0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.05) 1px, transparent 1px)', backgroundSize: '40px 40px', }, }; // Deep navy gradient used on all dark sections. const NAVY_GRADIENT = 'linear-gradient(150deg, var(--navy-700) 0%, var(--navy-500) 60%, var(--navy-600) 100%)'; // ---- Ring motif ---------------------------------------------------------- // Concentric outline rings echoing the crest ring. Decorative only. function Rings({ size = 320, tone = 'light', style = {} }) { const stroke = tone === 'navy' ? 'rgba(255,255,255,0.14)' : 'var(--ink-200)'; const accent = tone === 'navy' ? 'rgba(253,204,14,0.5)' : 'var(--red-200)'; return ( ); } // ---- Section decoration layer ------------------------------------------- // Drops faint rings + a dot cluster behind a section. Parent must be // position:relative with overflow:hidden. function SectionDecor({ tone = 'light' }) { return ( ); } // ---- Layered picture holder ---------------------------------------------- // A clean, light placeholder frame with an offset accent rectangle behind it // (the catalogue's stacked-rectangle look). Reads clearly as "photo goes here"; // drop a real photo in later via the `src` prop. function PhotoFrame({ src, alt = '', label = 'Photo', caption, accent = 'red', ratio = '4 / 3', icon = 'image', style = {}, }) { const Icon = window.Icon; const accentVar = `var(--${accent}-500)`; return (
{/* offset accent rectangle behind */} {/* thin accent rule top-left corner */} {/* the frame (white mat) */}
{src ? ( {alt} ) : (
{label}
)}
{caption && (
{caption}
)}
); } // ---- Floating education motifs ------------------------------------------- // Scatters faint subject icons behind a section for warmth (book, compass, // rocket, star, flask, etc). Parent must be position:relative; overflow:hidden. function EduMotifs({ tone = 'light', density = 'normal' }) { const Icon = window.Icon; const color = tone === 'navy' ? 'rgba(255,255,255,0.07)' : 'var(--ink-100)'; const base = [ { name: 'bookOpen', size: 64, top: '8%', left: '4%', rot: -12 }, { name: 'compass', size: 52, top: '64%', left: '8%', rot: 10 }, { name: 'rocket', size: 58, top: '14%', left: '88%', rot: 14 }, { name: 'flask', size: 48, top: '72%', left: '82%', rot: -8 }, { name: 'star', size: 40, top: '40%', left: '50%', rot: 0 }, { name: 'graduationCap', size: 50, top: '82%', left: '46%', rot: 6 }, { name: 'lightbulb', size: 44, top: '26%', left: '30%', rot: -6 }, { name: 'brain', size: 46, top: '54%', left: '72%', rot: 12 }, ]; const motifs = density === 'light' ? base.filter((_, i) => i % 2 === 0) : base; return ( {motifs.map((m, i) => ( ))} ); } // ---- Soft wave divider --------------------------------------------------- // A friendly curved transition between sections. Place at the very top or // bottom of a section; `fill` should match the ADJACENT section's background. function WaveDivider({ fill = 'var(--surface-page)', flip = false, height = 56 }) { return ( ); } // ---- Inline CTA band ------------------------------------------------------ // A compact, light-touch call-to-action strip for mid-page placement — less // prominent than a full navy CTA section, so it doesn't compete with the // hero/closing CTAs on the same page. function CTABand({ eyebrow, title, subtitle, buttonLabel, onClick, accent = 'gold' }) { const Icon = window.Icon; const { Button } = window.NGISDesignSystem_f6dc23; return (
{eyebrow && (
{eyebrow}
)}
{title}
{subtitle &&
{subtitle}
}
); } // ---- Multilingual class-name badge -------------------------------------- // Shows a class's English / Korean / Arabic names — the school's signature // trilingual identity system. function ClassNameStack({ en, ko, ar, accent = 'navy' }) { return (
{en} {ko} {ar}
); } window.Decor = { PATTERNS, NAVY_GRADIENT, CREST, CREST_CYCLE, Rings, SectionDecor, PhotoFrame, EduMotifs, WaveDivider, ClassNameStack, CTABand };