Files
Ferrous-Solitaire/solitaire_engine/assets/themes/default/PROVENANCE.md
T
funman300 172d7773f0 feat(engine): asset sources for embedded + user theme dirs (Card theme phase 3)
Implements Phase 3 of CARD_PLAN.md — the embedded:// + themes:// asset
sources the card-theme system loads from. The bundled default-theme
manifest ships in the binary via Bevy's EmbeddedAssetRegistry; user
themes load from user_theme_dir() through a FileAssetReader-backed
source registered as `themes://`.

Registration is split across:
  register_theme_asset_sources(&mut App)
    Called BEFORE DefaultPlugins. Registers `themes://` while
    AssetSourceBuilders is still mutable.
  AssetSourcesPlugin
    Added AFTER DefaultPlugins. Populates the EmbeddedAssetRegistry
    that AssetPlugin's build step would otherwise overwrite.

Constants exposed for downstream consumers:
  USER_THEMES                 = "themes"   (asset-source name)
  DEFAULT_THEME_MANIFEST_URL  = "embedded://solitaire_engine/assets/themes/default/theme.ron"

Includes a stub default theme.ron (52 face slots + back) so
`ThemeManifest::validate()` accepts it today; PROVENANCE.md documents
the plan to drop in real SVG art (hayeah/playing-cards-assets) in a
follow-up.

4 new tests covering source registration, embedded-registry
population, manifest validation against the embedded stub, and the
manifest-URL constant matching the embedded asset path.

cargo check --workspace --all-targets / clippy --workspace
--all-targets -- -D warnings clean. cargo test could not be run in
this turn because the C linker (cc) is unexpectedly absent from the
sandbox; the test bodies compile cleanly under cargo check --tests
and will run on a normal toolchain.
2026-05-01 05:47:13 +00:00

1.7 KiB

Default theme — provenance

This directory is the bundled-default card theme that ships embedded in the binary via Bevy's embedded_asset! macro (see solitaire_engine/src/assets/sources.rs). At runtime its files are addressable as embedded://solitaire_engine/assets/themes/default/....

Current state (Phase 3)

The theme.ron manifest in this directory lists all 52 face slots plus a back slot, but the referenced SVG files do not yet exist. The manifest is intentionally a stub so that:

  1. embedded_asset! has a real file to bundle (the manifest itself).
  2. ThemeManifest::validate accepts the manifest (it requires all 52 faces to be listed by name).
  3. The embedded:// asset source can be source-registered and queried without runtime errors during Phase 3.

The actual SVG art will be added when the project swaps in the hayeah/playing-cards-assets artwork — see the implementation plan in /CARD_PLAN.md. At that point, every .svg filename listed in theme.ron's faces map (and back.svg) must be added here, and each new file needs a corresponding embedded_asset!(app, ...) call in solitaire_engine/src/assets/sources.rs::register_default_theme.

How to add files to the bundled default theme

For each new file you drop into this directory:

  1. Drop the file under solitaire_engine/assets/themes/default/.
  2. Add one line to register_default_theme in solitaire_engine/src/assets/sources.rs of the form:
    embedded_asset!(app, "../../assets/themes/default/<filename>");
    
    (The path is relative to sources.rs, which lives in solitaire_engine/src/assets/.)
  3. Update this file with the licence and origin of the new asset.

Licence

To be filled in once real artwork lands.