How Themes Work
What a theme actually is
A WordCore theme is a folder inside themes/ containing a single required file: theme.json. That is all WordCore itself requires. When a theme is activated in Themes, WordCore stores its slug in core/settings['active_theme'] and fires the theme_activated hook.
WordCore does not automatically load any CSS, templates, or assets from the theme folder. There is no built-in front-end rendering pipeline. A theme on its own is inert — it is a declaration of intent, not a self-executing piece of code.
What actually loads your styles
Front-end addons (Pages, Blog, Forum, etc.) each render their own full HTML pages. Every one of them fires Hooks::fire('head') inside their <head> tag. A companion addon — a theme loader — listens on that hook and injects the theme's CSS into the page.
Why a linked stylesheet is not enough
Each front-end addon ships with its own inline <style> block embedded in the view. Because that block appears after your <link> tag in the HTML, it wins on source order and overrides your stylesheet — even with !important. Trying to serve the CSS via a JavaScript appendChild call solves the ordering problem but causes a flash of unstyled content on every page load.
The correct approach is to read the CSS file in PHP and echo it directly as an inline <style> block from the head hook. It arrives in the same HTML parse as the inline styles and, because it is declared before them, !important rules in it reliably win.
The ignore_theme flag
The Pages addon lets individual pages opt out of the active theme via an Ignore Theme toggle. The loader must respect this. Before injecting any CSS, it should check the current request URI against the pages in storage and skip injection if the matched page has ignore_theme set.