# `MaterialSpec.maps`

> Contract 2.0.0 · package sha256 `a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e` · generated from `configurator-runtime.d.ts` by `services/onsite-scripter/scripts/build-contract-docs.mjs`; edit the source, not this file.

Property of [`MaterialSpec`](MaterialSpec.md) · inherited by [`MaterialInput`](MaterialInput.md) · stable · since 2.0.0

```ts
maps?: Partial<Record<MapSlot, TextureSlot>>;
```

Per slot. Slots merge one by one: a slot left out keeps what is underneath, the GLB's map
included, so a plain finish names every slot it turns off. An 'orm' texture also fills the
occlusion, roughness and metallic channels its own layer leaves empty, over the maps
underneath ([`MapSlot`](MapSlot.md)).
Not for: a finish with no GLB map at all, which is a [`Material`](Material.md) or `{ ref }` that replaces the
worn material ([`MaterialInput`](MaterialInput.md)).

**Default:** {}

## Example

Imports: values (`has`, `validate`, the `Holo*Error` classes, the pure helpers) from `@holostep-configurators/runtime-client`, types from `@holostep-configurators/runtime-client/contract`, `/math` and `/testing` names from those entries; `boot` from the runtime module the root's `loadRuntimeAtFloor` resolves to. A type your page defines is your app's: declare it there, never import it from the package.

Compiled under the contract's strict settings (`examples/declaration/08-MaterialSpec.maps.ts`):

```ts
import type { Session } from '@holostep-configurators/runtime-client/contract';
declare const session: Session;
declare const signal: AbortSignal;
// a plain colour that keeps the GLB's normal and occlusion maps
await session.find({ slot: 'frame' }).set({
  material: {
    baseColor: '#2b2b2b',
    maps: {
      baseColor: 'none', metallic: 'none', roughness: 'none', orm: 'none', emissive: 'none',
      alpha: 'none', clearcoat: 'none', clearcoatRoughness: 'none', clearcoatNormal: 'none',
      sheenColor: 'none', sheenRoughness: 'none', specular: 'none', specularColor: 'none',
    },
  },
});
```

## Generic-API test (spec 3.1)

| Rule | Result |
| --- | --- |
| 1. Neutral name | pass: `maps` names no product |
| 2. A precedent | pass: [CSS cascade (ordered, persistent rules)](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_cascade/Cascade) (row `G8`); [Blender Principled BSDF (Metallic, Roughness inputs)](https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html) (row `K16`) |
| 3. Two apps, or labs | pass: 3 apps (ledger: app-e61a0b42ad, app-fc07850558, app-fc306ec3dc; fleet cross-check: app-fc07850558) |
| 4. The cheaper fix first | decided per need in Appendix B: rows `G8`, `K16` at tier stable (a member only where no rule, data, asset or app code serves the need) |
