'portal-dark']) === '/web-app-starter/?theme=portal-dark', 'root theme link omits the empty route segment'); test_assert(URL::Link('themes', ['theme' => 'portal-dark']) === '/web-app-starter/?themes&theme=portal-dark', 'named route links keep the route segment and query parameters'); test_assert(component_exists('components/example/theme-switcher'), 'component existence works for explicit component paths'); test_assert(component_exists('example/theme-switcher'), 'component existence works for shorthand component paths'); ob_start(); component('example/theme-switcher'); $theme_switcher_html = ob_get_clean(); test_assert(str_contains($theme_switcher_html, 'theme-switcher'), 'component rendering works through the shorthand component API'); $portal_dark = cfg('theme/options/portal-dark'); test_assert(!empty($portal_dark['description']) && !empty($portal_dark['footer_text']), 'theme metadata is centralized in config'); echo "All smoke tests passed.\n";