/* * AussomFooter - Reusable site footer. * * Usage: * footer = new AussomFooter(); * page.add(footer.getEl()); */ class AussomFooter { public footerEl = null; public AussomFooter() { outer = new Div(); outer.setAttr('class', 'aussom-footer'); cont = new BsContainer(); row = new BsRow(); /* --- Column 1: Brand + tagline --- */ brandCol = new BsCol('12 col-md-4'); brandCol.setAttr('class', 'col-12 col-md-4 mb-4 mb-md-0'); logoImg = new Img(); logoImg.setAttr('src', '/aussom-logo.png'); logoImg.setAttr('alt', 'Aussom'); logoImg.setAttr('class', 'footer-logo'); brandCol.add(logoImg); brandName = new P(); brandName.setAttr('class', 'mb-1 fw-bold text-white'); brandName.add(new Text('Aussom')); brandCol.add(brandName); tagline = new P(); tagline.setAttr('class', 'footer-tagline'); tagline.add(new Text('Write once. Embed everywhere.')); brandCol.add(tagline); /* --- Column 2: Language --- */ langCol = new Div(); langCol.setAttr('class', 'col-6 col-md-2 mb-4 mb-md-0'); langHead = new P(); langHead.setAttr('class', 'footer-col-heading'); langHead.add(new Text('Language')); langCol.add(langHead); langLinks = new Ul(); langLinks.setAttr('class', ''); langLinks.add(this.footerLink('Quick Start', 'docPage?product=aussom&page=written/quick-start.md&title=Quick Start')); langLinks.add(this.footerLink('Language Guide', 'docPage?product=aussom&page=written/aussom.md&title=Language Overview')); langLinks.add(this.footerLink('API Reference', 'docsProduct?product=aussom')); langCol.add(langLinks); /* --- Column 3: Tools --- */ toolsCol = new Div(); toolsCol.setAttr('class', 'col-6 col-md-2 mb-4 mb-md-0'); toolsHead = new P(); toolsHead.setAttr('class', 'footer-col-heading'); toolsHead.add(new Text('Tools')); toolsCol.add(toolsHead); toolsLinks = new Ul(); toolsLinks.add(this.footerLink('Aussom-Script', 'docsProduct?product=aussom-script')); toolsLinks.add(this.footerLink('Aussom Server', 'docsProduct?product=aussom-server')); toolsLinks.add(this.footerLinkNewTab('Playground', 'https://playground.aussom-lang.com')); toolsLinks.add(this.footerLink('Download', 'download')); toolsCol.add(toolsLinks); /* --- Column 4: Community --- */ commCol = new Div(); commCol.setAttr('class', 'col-6 col-md-2 mb-4 mb-md-0'); commHead = new P(); commHead.setAttr('class', 'footer-col-heading'); commHead.add(new Text('Community')); commCol.add(commHead); commLinks = new Ul(); commLinks.add(this.footerLinkNewTab('GitLab', 'https://gitlab.com/cupofcode/aussom-base')); commLinks.add(this.footerLinkNewTab('Issues', 'https://gitlab.com/cupofcode/aussom-base/-/work_items')); commLinks.add(this.footerLink('Changelog', 'download')); commCol.add(commLinks); /* --- Assemble row --- */ row.add(brandCol); row.add(langCol); row.add(toolsCol); row.add(commCol); cont.add(row); /* Divider + copyright */ divider = new Hr(); divider.setAttr('class', 'footer-divider'); cont.add(divider); copy = new P(); copy.setAttr('class', 'footer-copy'); copy.add(new Text('Copyright 2026 Austin Lehman. All rights reserved.')); cont.add(copy); outer.add(cont); this.footerEl = outer; } /* Builds a single