GeoLeaf Core API - v3.0.0
    Preparing search index...
    AttributePrimitive:
        | "string"
        | "number"
        | "boolean"
        | "string[]"
        | "object"
        | "object[]"

    What an attribute value IS in the GeoJSON feature.

    Derived from the value type each field-renderer component actually declares (ComponentDefinition<TValue>), not from the field name.

    ⚠️ badge ({label, color}), link ({href, label?}) and price ({amount, currency}) hold objects on the capture side — which is why passing one of them to a plain text renderer yields [object Object], the defect that motivated splitting the two type columns in the first place.

    🛑 But on the reading side they are scalars, and this doc used to claim otherwise. Confronting the declaration with the shipped GeoJSON found 15 fields on 86 holding plain strings under those three widgets. The three are therefore declared as unions in AttributeWidgetPrimitive, and the sentence above is scoped rather than absolute — it was written from the capture components alone.