SheetXL - v1.0.2
    Preparing search index...

    Type Alias Feature

    Feature: typeof ICellRange.Feature[keyof typeof ICellRange.Feature]

    The public feature vocabulary — what a cell or range carries, as a queryable dimension.

    This is the agent-facing read vocabulary: getCounts, getRegions and isContentful select by it, and the agent read tools (grep, the regions read) use the same words. It is deliberately distinct from ICell.Content, the transfer vocabulary (clear, copyFrom) — "paste formats" is a coarse transfer bucket, while querying wants the split parts (Fill, Border, NumberFormat…). One enum serving both jobs is how the vocabulary got muddy the first time.

    Members map onto the engine's per-feature spatial indexes. The mapping is internal and not one-to-one: several features may project from one index (NumberFormat/Alignment/Font over the content-style map). Notes joins when the backing is implemented; a feature that silently reports nothing is worse than a missing one.

    String/Number/Boolean are deliberately absent as separate members, even though they are real ScalarType values. "How many numbers" is a count read straight off the values, which is exactly the one pass IRangeStats.getTypedCounts() already makes, richer (it composes with aggregates and frequencies for free, in the same call) — range.getStats() is the vocabulary for that. Where the numbers are is a partition, and that is the one Feature.Kind answers: a typed row inside a block of text is a region of its own.

    Error stays, for a reason unrelated to the above: it has real spatial identity of its own (the reconciled error view) and partitions like any stored feature — it was never in the same boat as the other three. DateFormat stays too, but as exactly what its name says: a formatting predicate, the same tier as NumberFormat/Alignment/Font, not a value kind — it answers "does this cell carry a date-category number format", nothing about what the value underneath actually is. A caller after "how many cells are genuinely dates" (numeric value AND that format) composes it: DateFormat regions intersected with getStats().getTypedCounts()'s Number — there is deliberately no single feature that already does that intersection, because "is this a date" is a computed fact about a cell's value, read through getInteropType(), not a thing this vocabulary partitions on.