"""Assemble self-contained mockup pages: tokens + fonts (base64) + shell + page.""" import base64, pathlib, re HERE = pathlib.Path(__file__).parent OUT = pathlib.Path.home() / 'Design/extrudex-v3' FONTS = OUT / 'fonts' tokens = (OUT / 'design-system-v3.css').read_text() def embed_font(match): name = match.group(1) data = base64.b64encode((FONTS / name).read_bytes()).decode() return f"url('data:font/woff2;base64,{data}')" tokens = re.sub(r"url\('\./fonts/([^']+)'\)", embed_font, tokens) app_css = (HERE / 'app.css').read_text() ICONS = { 'dashboard': '', 'filament': '', 'prints': '', 'printers': '', } NAV = [('dashboard', 'Dashboard', '01-dashboard.html'), ('filament', 'Filament', '02-filament.html'), ('prints', 'Prints', None), ('printers', 'Printers', '04-printers.html')] THEME_HEAD = """""" def rail(active): links = [] for key, label, href in NAV: cur = ' aria-current="page"' if key == active else '' extra = '' if key == 'dashboard': extra = 'new' if href is None: links.append(f'{ICONS[key]}{label}') else: links.append(f'{ICONS[key]}{label}{extra}') return f"""""" def page(slug, title, active, description): src = (HERE / 'pages' / f'{slug}.html').read_text() css_m = re.search(r'', src, re.S) page_css = css_m.group(1) if css_m else '' body = re.sub(r'', '', src, flags=re.S).strip() js_m = re.search(r'', body, re.S) page_js = '' if js_m: page_js = f'' body = re.sub(r'', '', body, flags=re.S) html = f""" {title} {THEME_HEAD}
{rail(active)}
Design System v3 proposal Mockup with sample data from the real inventory. Nothing here is wired to the API. dev on dev today feature feature branch only API gap stored, not served
{body}
{page_js} """ (OUT / 'screens' / f'{slug}.html').write_text(html) print(slug, len(html) // 1024, 'KB') page('01-dashboard', 'Extrudex Dashboard', 'dashboard', 'Stock summary and recent prints, Soft UI v3 mockup.') page('02-filament', 'Extrudex Filament', 'filament', 'Filament inventory list with search, add, edit and delete, Soft UI v3 mockup.') page('03-spool-form', 'Extrudex Spool Form', 'filament', 'Add/Edit spool form with 409 conflict and field-level 400 errors, Soft UI v3 mockup.') page('04-printers', 'Extrudex Printers', 'printers', 'Printers screen with stored fields, dropped MQTT state and a Future section, Soft UI v3 mockup.')