Whether the active profile is a MODULAR profile without a themes block — one that declares
no theme.
A modular profile resolves its themes INTO the active profile, which is where
ThemeLoader reads them without a request. Without that block, the loader falls back
to the legacy profiles/<id>/themes.json, which can only 404 for such a profile — retried
after 1 s. The two callers of the loader ask this first: the boot's theme engine, whose
request the reveal waited for, and the theme selector, whose request came after it. A LEGACY
profile still goes through the loader: its themes do live in that file.
⚠️ Asked by the CALLERS, not inside the loader: its fallback to the legacy file is a
documented contract, and a profile whose shape cannot be read must still reach it.
Parameters
config: Record<string,unknown>|null = ...
The GeoLeaf.Config facade, read loosely. Defaults to the live one.
Returns boolean
true only when the active profile is readable, modular, and carries no themes.
Example
if (!declaresNoThemes()) { constthemes = awaitThemeLoader.loadThemesConfig(profileId); }
Whether the active profile is a MODULAR profile without a
themesblock — one that declares no theme.A modular profile resolves its themes INTO the active profile, which is where
ThemeLoaderreads them without a request. Without that block, the loader falls back to the legacyprofiles/<id>/themes.json, which can only 404 for such a profile — retried after 1 s. The two callers of the loader ask this first: the boot's theme engine, whose request the reveal waited for, and the theme selector, whose request came after it. A LEGACY profile still goes through the loader: its themes do live in that file.⚠️ Asked by the CALLERS, not inside the loader: its fallback to the legacy file is a documented contract, and a profile whose shape cannot be read must still reach it.