siyuan-note/siyuan · error

invalid layer fit [%s]

Error message

invalid layer fit [%s]

What it means

Thrown by loadBootAppearance when a boot appearance manifest declares a layer whose "fit" value is not one of the accepted CSS-like object-fit values. Empty fit values default to "cover" so this only fires for explicitly wrong strings. It aborts loading of the whole boot appearance package.

Source

Thrown at kernel/model/boot_appearance.go:484

		}
		if layer.Type == "video" {
			if layer.Poster == "" {
				err = errors.New("video poster is required")
				return nil, err
			}
			if _, _, err = validateBootAppearanceResource(pluginDir, appearanceDir, layer.Poster, "image"); err != nil {
				return nil, fmt.Errorf("invalid video poster: %w", err)
			}
		} else if layer.Poster != "" {
			err = errors.New("image layer cannot declare a poster")
			return nil, err
		}
		fit := layer.Fit
		if fit == "" {
			fit = "cover"
		}
		if !isValidBootAppearanceFit(fit) {
			err = fmt.Errorf("invalid layer fit [%s]", fit)
			return nil, err
		}
		position := layer.Position
		if position == "" {
			position = "center"
		}
		if !isValidBootAppearancePosition(position) {
			err = fmt.Errorf("invalid layer position [%s]", position)
			return nil, err
		}
		item := &BootAppearanceLayer{
			ID:       layer.ID,
			Type:     layer.Type,
			Src:      bootAppearanceAssetURL(pkg.Name, appearanceID, layer.Src),
			Fit:      fit,
			Position: position,
		}
		if layer.Poster != "" {

View on GitHub (pinned to 8641553a1f)

Solutions

  1. Open the boot appearance package's manifest and change the layer's fit to one of: cover, contain, fill, none, scale-down (lowercase).
  2. Remove the fit field entirely to get the default "cover".
  3. Validate the manifest with a quick check before shipping: allowed set is cover|contain|fill|none|scale-down.

Example fix

// before
"fit": "Cover"
// after
"fit": "cover"
Defensive patterns

Strategy: validation

Validate before calling

function validLayerFit(fit) { return !fit || ["cover","contain","fill","none","scale-down"].includes(fit); }

Type guard

const isLayerFit = (v) => typeof v === "string" && ["cover","contain","fill","none","scale-down"].includes(v);

Try / catch

try { appearances = await getBootAppearances(); } catch (e) { if (String(e).includes("invalid layer fit")) { /* fix manifest, skip package */ } else throw e; }

Prevention

When it happens

Trigger: Calling GetBootAppearances or getBootAppearanceByID while a manifest.json contains a layer with e.g. "fit": "stretch" or "Fit": "Cover" (case-sensitive, must be lowercase cover/contain/fill/none/scale-down).

Common situations: Hand-edited manifest files, copy-pasted CSS values like "object-fit: cover", wrong casing ("Cover"), or manifests written against an older/imagined spec.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11). Data as JSON: /api/errors/9c665ca659bae381. Report an issue: GitHub.