> ## Oymyakon DS index
> Fetch the full index at: https://super-dollop-pzmo65r.pages.github.io/llms.txt
> HTML preview: https://super-dollop-pzmo65r.pages.github.io/notch.html
> Source: specs/components/notch/notch.md, specs/components/notch/notch-a11y.md, specs/components/notch/capabilities.json

---

# Notch · Oymyakon DS 3

> A short strip that hangs from the top or bottom edge of a card: an icon, a short note and an
> optional chevron or avatar stack — "Fare is an estimate".

**Version:** 3.0.3 · **Status:** Ready · **Figma:** `[Notch] 3.0` (main components file `7vdl5YkZFDWvh9QvSmydsH`, page `34638:4438`, set `36002:74102`, key `ddfd19a7…` — merged from the branch `WiWGOeTcDPnBYRPnMnAG73`, node-ids unchanged; Specification frame `36095:463`, ported 1:1 from the site page)

---

## 1. Description

Notch attaches a short note to the edge of a host card — the tariff card in Ride
Hailing is the first host ("Fare is an estimate"). It sits flush against the card's top or bottom
edge: the two outer corners are rounded, the two inner corners are square so the strip reads as
part of the card.

The strip is either **interactive** — a button that opens the explanation behind the note — or
**static**, a plain informational strip. Interactivity is an instance parameter (owner,
2026-10-09): a notch that shows the chevron is always interactive; without the chevron it is
static by default and may still be made a button.

This file was authored from the Figma set before it had a Specification frame — from the set
(`Position × Size`) and its building blocks on the same page — `RowContent` (the exposed content
row: `Alignment × RTL` + the two slot booleans), the `🔴StartSlot` icon slot, the `🔵EndSlot`
swap (`IconContainer | Avatars`) and the `Avatars` stack, which the DS ships as the
[StackContainer](https://super-dollop-pzmo65r.pages.github.io/stack-container.md) primitive (owner, 2026-10-09). The
Specification frame (`36095:463`) was later ported 1:1 from the site page; this file stays the source.

### Platform implementations

| Platform | Entry point | Version | Notes |
|---|---|---|---|
| iOS | `DsNotch` (DS3) | — | `init(text:)`; position, size, alignment, the start and end slots, the colours and `onTap` are modifiers. In the iOS Design Context Bridge since 2026-11 (the manifest binds the set since 2026-11-12); the bridge states no Figma version |
| Android | — | — | Not shipped (no entry in the Android bridge, 2026-11-12) |
| Flutter | — | — | Not shipped |
| Web | `src/shared/shared.css` (`.notch`) | 3.0.1 | Reference implementation, this repo; preview page `src/notch.njk` — the first build of this component on any platform |

---

## 2. Anatomy

```
Notch (.notch)                      fills the host's width · Background/BaseGrey · two outer corners s28
└── RowContent (.notch__row)          s4 between the parts
    ├── StartSlot (.notch__start-slot)   optional · a 24 icon — discount-outlined by default
    ├── StartText (.notch__start-text)   Compact Body, Secondary · S one line, M up to two
    └── EndSlot (.notch__end-slot)       optional · chevron-right-small (24) or a StackContainer
```

| Part | Required | Description |
|---|---|---|
| **Container** | Required | The strip: `Background/BaseGrey`, horizontal padding `s20`, vertical padding per size; radius `s28` on the two outer corners only (Top: top-left + top-right; Bottom: bottom-left + bottom-right) at smoothing 0.6 |
| **StartSlot** | Optional, on by default | An `[IconContainer] 3.0` at 24 — `discount-outlined` in `TextAndIcon/Primary` by default; any DS icon |
| **StartText** | Required | The note — one line in S, up to two lines in M; the overflow ends with an ellipsis |
| **EndSlot** | Optional, on by default | `Instance=IconContainer` — `chevron-right-small` at 24 in `TextAndIcon/Primary` (the default) — or `Instance=Avatars` — a [StackContainer](https://super-dollop-pzmo65r.pages.github.io/stack-container.md) of Mini squircles (1–3 portraits in the Figma staging) |

- The chevron means "opens more": a notch that carries it is interactive by contract.
- S stays one line high. M keeps a `s44` minimum and takes up to two lines, centred in it — the
  overflow ellipsizes instead of growing the strip further.
- In the **Start** alignment the text fills the row and the EndSlot pins to the end edge; in
  **Center** the three parts hug their content and the group centres in the strip.

### RTL layout

The row mirrors: the StartSlot moves to the right edge, the EndSlot to the left, the text aligns to
the start (right) edge. The chevron follows its own `RTL` variant (it points left); the
`discount-outlined` glyph is not directional and does not flip. A StackContainer in the EndSlot
mirrors with the reading direction. Figma stages it as `RowContent` `RTL=On`; the web takes it from
`dir="rtl"`.

---

## 3. Variants and sizes

| Axis | Values | Default | Web mechanism |
|---|---|---|---|
| **Position** | `top` · `bottom` | `top` | `.notch--bottom` — which two corners round; `top` is the bare root (`.notch--top` is a hook with no rule of its own) |
| **Size** | `s` · `m` | `s` | `.notch--m`; `s` is the bare root (`.notch--s` is a hook with no rule of its own) |
| **Alignment** | `start` · `center` | `start` | `.notch--center` (the exposed `RowContent` property) |
| **StartSlot** | off · on | on | Presence of `.notch__start-slot` |
| **EndSlot** | off · `icon` · `stack` | `icon` | Presence of `.notch__end-slot`; its content is the chevron or a `.stack-container` |
| **Interactive** | off · on | on (the default EndSlot is the chevron) | `.notch--interactive` on a `<button type="button">` root; a static notch is a `<div class="notch">` |
| **RTL** | off · on | off | `dir="rtl"` |
| **Fill** | any DS token | `Background/BaseGrey` | `--notch-fill` re-pointed on the instance |
| **Text colour** | any DS token | `TextAndIcon/Secondary` | `--notch-text` re-pointed on the instance |

| Size | Height | Vertical padding | Horizontal padding |
|---|---|---|---|
| **S** | `var(--sp-s32)` — one line | `var(--sp-s4)` | `var(--sp-s20)` |
| **M** | `var(--sp-s44)` minimum — one or two lines, centred | `var(--sp-s4)` | `var(--sp-s20)` |

- EndSlot `icon` (the chevron) requires Interactive on — a chevron on a static strip promises an
  action that does not exist.
- **M is the two-line size** (owner, 2026-10-09): a `s44` minimum height, up to two lines of text
  centred in it, the same `s4` vertical padding as S (it matters once scaled text outgrows the
  minimum). The merged Figma set allows M two lines (`maxLines` 2) but still pads it `s10` under a
  `s44` cap — `s10` + two 16 lines cannot fit; flagged for the Figma side.
- Touch targets (§ 10): S (32) sits under both platform guidelines; M (44) meets iOS's 44 pt and
  stays under Android's 48 dp.
- The S height holds with a 24 slot in the row. With both slots off the row hugs the 16 text
  line (Figma's hug — the height is a cap, not a floor): S is 24.

---

## 4. States

Notch has one state: **Standard** (owner, 2026-10-09). The Figma set stages no State axis at all.

| State | What shows |
|---|---|
| **Standard** | The strip — the fill (`Background/BaseGrey` by default), the note (`TextAndIcon/Secondary` by default), the icons in `TextAndIcon/Primary` |

- No Pressed, no Hover, no Disabled, no Skeleton — an interactive notch reacts to a tap without a
  visual state of its own. The host's skeleton covers the notch while the card loads.
- The fill and the note colour are defaults, not states: an instance re-points them to any DS
  token (§ 6).
- On the web an interactive notch draws the keyboard focus ring (§ 10) — an accessibility
  affordance, not a design state.

---

## 5. Animation and behavior

Notch declares no motion of its own (reference:
[`motion-rules.md`](https://super-dollop-pzmo65r.pages.github.io/motion.md)). It rides on
[DecorateContainer](https://super-dollop-pzmo65r.pages.github.io/decorate-container.md) (owner, 2026-10-09): the card sits in
Slot#1, the Notch in Slot#2 — `stretch` to the card's width, docked on the card's top edge (Top) or
bottom edge (`--v-bottom`, Bottom) in the band Slot#1 reserves for it, in the `slide` mode.

| Event | Token | Notes |
|---|---|---|
| Appear | `var(--transforming-state-slow)` | 300 ms slow-ease-out — the Notch slides out of the card's edge |
| Hide | `var(--transforming-exit-slow)` | 300 ms accelerated-ease-in — back into the edge |

- No scale and no fade, owned by the container: the band grows with the Notch (the container
  resizes — a layout animation on the owner's call), and the Notch comes out of the card's edge.
- Reduced motion zeroes both at the token — the Notch simply appears.

- Tap on an interactive notch opens the explanation behind the note — a sheet or a screen; the
  destination is the host's.

---

## 6. Color tokens

| Element | Token | Notes |
|---|---|---|
| Container fill | `var(--background-base-grey)` | The default; an instance re-points `--notch-fill` to any DS token |
| StartText | `var(--text-and-icon-secondary)` | The default; an instance re-points `--notch-text` to any DS token |
| StartSlot icon | `var(--text-and-icon-primary)` | `discount-outlined` by default |
| Chevron | `var(--text-and-icon-primary)` | `chevron-right-small` |
| StackContainer content | the Squircle's own | Mini squircles, Img type, border `var(--border-default)` |
| Focus ring (web) | `var(--text-and-icon-primary)` | `s2`, drawn inward |

A re-pointed pair keeps its own contrast duty: the note stays at 4.5:1 or more on the fill
(§ 10).

---

## 7. Typography

| Element | Style | Tokens |
|---|---|---|
| StartText | Body/Compact Body | `var(--text-body-compact-body-*)` — 14/16, Suisse Intl Book |

---

## 8. Spacing

Container paddings, radius and the height cap are bound to `SP/100% ratio`; the icons (`s24`) and
the text (`s14`/`s16`) to `SP/150% ratio`.

| Property | Token | Value @100% | Notes |
|---|---|---|---|
| Width | — | fills the host | The master is staged at 360 fixed — the card's width |
| Height — S | `var(--sp-s32)` | 32 | Figma's `maxHeight`; one line |
| Height — M | `var(--sp-s44)` | 44 | Minimum (owner, 2026-10-09); one or two lines, centred |
| Vertical padding — S | `var(--sp-s4)` | 4 | |
| Vertical padding — M | `var(--sp-s4)` | 4 | Owner, 2026-10-09 — the Figma set still stages `s10`, now with two lines under the `s44` cap (flagged) |
| Horizontal padding | `var(--sp-s20)` | 20 | Both sizes |
| Outer corner radius | `var(--sp-s28)` | 28 | The two outer corners; smoothing 0.6 in Figma, a plain radius on the web (the Squircle precedent) |
| Inner corner radius | `var(--sp-s0)` | 0 | Flush with the host |
| Slot ↔ text | `var(--sp-s4)` | 4 | The RowContent gap, on both sides of the text |
| StartSlot / chevron | `var(--sp-s24)` | 24 | IconContainer at 24 |

---

## 9. Usage context

### Composition

A Notch is never laid out on its own: it is the Slot#2 decorator of a
[DecorateContainer](https://super-dollop-pzmo65r.pages.github.io/decorate-container.md) whose Slot#1 is the card (owner,
2026-10-09):

- the container carries the Notch's own fill (`Background/BaseGrey` by default) and the same
  `var(--sp-s28)` corners as the card and the Notch — the strip reads as part of the surface, only
  its row shows, and nothing shows through the card's rounded corners; an instance that re-points
  `--notch-fill` re-points the container's fill to the same token;
- the band: `.decorate-container--band` with `--dc-band` = the Notch's height (`var(--sp-s32)` S,
  `var(--sp-s44)` M) — Slot#1 opens that band on the docking side (`--v-bottom` for the Bottom
  position) as the Notch appears and closes it as the Notch hides, so the container really resizes
  with it; hidden, the container is exactly the card;
- the card stays still (owner, 2026-10-09): the layout anchors the container on the card's side,
  so the band grows outward — up for Top, down for Bottom — and only the Notch and its band move;
- `stretch` — the Notch takes the card's width; `slide` (§ 5) — it slides out of the card's edge.

### When to use Notch

- A short note that belongs to one card — "Fare is an estimate" on the tariff card.
- A short status line with an avatar stack ("3 drivers are viewing your order").
- An entry point to an explanation, when the note is interactive and carries the chevron.

### When not to use

- For anything longer than two lines — the text truncates; use a Notification or HeaderAlert.
- Detached from a host — the square inner corners only make sense against a card edge.
- For a primary action — that is a Button; a notch is a secondary, informational strip.
- With more than one action — the whole strip is one target.

### Related components

- [StackContainer](https://super-dollop-pzmo65r.pages.github.io/stack-container.md) — the EndSlot's avatar stack.
- [Squircle](https://super-dollop-pzmo65r.pages.github.io/squircle.md) — the Mini squircles inside the stack.
- [IconContainer](https://super-dollop-pzmo65r.pages.github.io/icon-container.md) — the start icon and the chevron.
- [TariffCell](https://super-dollop-pzmo65r.pages.github.io/tariff-cell.md) — the row inside the tariff card that the notch hangs
  from; the tariff card organism itself is not in the DS yet.

---

## 10. Accessibility

Brief summary. Full spec: [`notch-a11y.md`](https://super-dollop-pzmo65r.pages.github.io/notch.md).

- **Interactive** notch = one button. Its name is the visible note; the start icon, the chevron and
  the avatar stack are decorative.
- **Static** notch = plain text in the reading order, no role, no focus stop.
- An interactive notch keeps its own focus stop after the card — the DecorateContainer
  interactive-decorator exception; a hidden notch is out of the tree.
- An avatar stack carries no meaning of its own — whatever it implies ("3 drivers") is said in the
  text.
- Touch target: S is 32 high — under the 44 pt (iOS) / 48 dp (Android) guidance; M is 44 — it
  meets iOS and stays under Android. Both are above WCAG 2.5.8's 24 px. Interactive notches favour
  M.
- Text contrast: `TextAndIcon/Secondary` on `Background/BaseGrey` — see the a11y spec for the
  measured ratio.

---

## 11. Analytics and coverage contract

Contract per [`prototype-analytics-and-coverage.md`](https://github.com/inDriver/oymyakon-ds/blob/main/docs/prototype-analytics-and-coverage.md).

| Field | Value |
|---|---|
| `data-ds-component` | `notch` |
| Coverage unit | yes |
| Tap target model | The root, when Interactive is on; none when static |
| Actions | `tap` (open the explanation) |
| Internal targets | none — the chevron and the avatar stack are not separate targets |
| Emits value | no |

Attribute model: `data-ds-variant` = the position (`top` \| `bottom`), `data-ds-preset` = the size
(`s` \| `m`), `data-ds-state` = `standard`. The StackContainer inside is structural and carries no
`data-ds-*` of its own; its Squircles keep theirs.

```html
<button class="notch notch--top notch--m notch--interactive" type="button"
        data-ds-component="notch" data-ds-component-id="fare-estimate"
        data-ds-variant="top" data-ds-preset="m" data-ds-state="standard"
        data-ds-action="tap" data-ds-target="fare-estimate">
  <span class="notch__row">
    <span class="notch__start-slot" aria-hidden="true"><!-- discount-outlined --></span>
    <span class="notch__start-text">Fare is an estimate</span>
    <span class="notch__end-slot" aria-hidden="true"><!-- chevron-right-small --></span>
  </span>
</button>
```

---

## Changelog

| Version | Date | Change |
|---|---|---|
| 3.0.3 | 2026-11-12 | Status Draft → Ready (owner, 2026-11-12) — the backlog sweep: merged on main, web build shipped, no owner decision open. No contract change; Figma-side flags recorded above stay open on the Figma side. |
| 3.0.2 | 2026-11-12 | Platform table: iOS ships `DsNotch` (DS3) — the iOS Design Context Bridge carries the set `36002:74102` since 2026-11, found by the manifest sync of 2026-11-12, which now binds it (Position and Size on iOS). Android still has no entry. |
| 3.0.1 | 2026-10-19 | The Figma branch `WiWGOeTcDPnBYRPnMnAG73` merged into the main components file: the header points at the main file (page `34638:4438`, set `36002:74102` — node-ids unchanged, the set key is now `ddfd19a7…`) and the new Specification frame `36095:463` (ported from the site page). Re-checked on the merged set: M now allows two lines (`maxLines` 2) but keeps the `s10` padding under the `s44` cap — still flagged. Neither platform bridge carries the set, so the manifest entry binds no node yet. No contract change. |
| 3.0.0 | 2026-10-09 | Initial spec, from the Figma `[Notch] 3.0` set on a **branch** of the main components file (`WiWGOeTcDPnBYRPnMnAG73`, page `34638:4438`, set `36002:74102`) and its building blocks — no Specification frame exists. Position `top`/`bottom` × Size `s` (32, one line) / `m` (a `s44` minimum, up to two lines — owner, 2026-10-09; the Figma set stages M with `s10` padding and one line, flagged), padding `s4`/`s20` in both; `Background/BaseGrey`; radius `s28` on the two outer corners (smoothing 0.6); the exposed `RowContent` (Alignment `start`/`center`, RTL, StartSlot/EndSlot booleans, gap `s4`); StartSlot `discount-outlined` 24; Text Compact Body in Secondary, ellipsized; EndSlot `chevron-right-small` 24 or the `Avatars` stack — shipped as the new [StackContainer](https://super-dollop-pzmo65r.pages.github.io/stack-container.md) primitive (owner, 2026-10-09). The **Interactive** parameter (owner, 2026-10-09): the chevron implies a button; without it the strip is static or a button by choice. One state, Standard (owner, 2026-10-09): no pressed state and no motion; the fill (`Background/BaseGrey`) and the note colour (`TextAndIcon/Secondary`) are defaults an instance re-points to any DS token (`--notch-fill` / `--notch-text`). Composition and motion (owner, 2026-10-09): the Notch is a DecorateContainer Slot#2 decorator over the card — the container in the Notch's fill and `s28` corners, the band (`--dc-band`, the Notch's height) opening and closing with it so the container resizes, `stretch`, the new `slide` mode (DecorateContainer 3.4.0) on `var(--transforming-state-slow)` / `var(--transforming-exit-slow)`, 300 ms; the Notch itself declares no motion. Neither mobile platform ships the component. The set lives on a BRANCH, so no manifest binding until it merges (the node-ids then carry over). |

---

# Notch — Accessibility

The note is the content. An **interactive** notch is one button whose name is the visible note; a
**static** notch is plain text in the reading order. Every glyph — the start icon, the chevron, the
avatar stack — is decorative: whatever it implies is said in the text.

Label rule: announce the note, not the decoration — ✅ "Fare is an estimate, button", ❌ "Discount
icon, Fare is an estimate, chevron". An avatar stack is never read as "3 images": the note puts the
count in its words ("3 drivers are viewing your order").

**Its own element, after the card.** The Notch is a DecorateContainer decorator, but an interactive
one keeps its own element, role and focus stop — it never merges into the card's node (the
DecorateContainer 3.4 interactive-decorator exception). It follows the card in the reading order (the
DOM order), on the Top edge as on the Bottom one. A static notch is read as plain text after the card.

**Hidden is out of the tree; appearing is silent.** A hidden notch (the container's `--off`) is
neither focusable nor announced. The Notch never announces its own appearance: a note that matters
(a price caveat) belongs in the tree whenever the card is; a host that reveals it later and needs it
heard uses a polite live region — the host's call.

## Android · TalkBack

| Element | Label | Value | Trait | Hint |
|---|---|---|---|---|
| Notch — interactive | The note text | — | `Role.Button`; one focus stop (`mergeDescendants`) | "Double-tap to activate" by default; the host names the destination through `onClickLabel` ("Double-tap to learn how the fare is calculated") |
| Notch — static | The note text | — | Plain text, read in the host's reading order; no role, not a separate focus stop | — |
| StartSlot icon | — | — | Decorative (`contentDescription = null`) | — |
| Chevron | — | — | Decorative — the Button role and the note carry the action | — |
| StackContainer | — | — | Decorative; its squircles are not elements | — |

### Edge states

- **Truncation:** the label is the **full** note, never the ellipsized string — the visual cut
  (S after one line, M after two) does not shorten the announcement.
- **RTL:** the row mirrors; the announcement is unchanged.
- **Touch target:** S is 32 dp high, M 44 — both under the 48 dp guidance; the strip's full width
  does not make up for the height. Both stay above WCAG 2.5.8's 24 px minimum; interactive
  notches favour M. An S with both slots off is 24 — exactly the WCAG floor; an interactive S keeps
  a slot.
- **Text scaling (130 % / 150 %):** S stays one line (owner ruling), so a long note loses its tail
  for sighted readers even though the label is complete — keep S notes short; a note that must be
  read in full is an M.
- **Disabled / Error:** not applicable — one state, Standard.
- **Skeleton:** the host's skeleton covers the notch while the card loads; the notch is out of the
  tree for that time (the host's `aria-busy` container, the hidden decorator).

---

## iOS · VoiceOver

| Element | Label | Value | Trait | Hint |
|---|---|---|---|---|
| Notch — interactive | The note text | — | `.isButton`; one element (`children: .combine`) | The host's, when the destination is not obvious |
| Notch — static | The note text | — | `.isStaticText`; joins the host card's reading order | — |
| Icons / StackContainer | — | — | `accessibilityHidden(true)` | — |

### Edge states

- **Truncation / RTL:** as on Android — the full note as the label, a mirrored row with an
  unchanged announcement.
- **Touch target:** S is 32 pt — under the 44 pt guidance; M (44) meets it; an S with both slots
  off is 24.
- **Text scaling / Disabled / Skeleton:** as on Android — S stays one line, no disabled or error
  state, out of the tree under the host's skeleton.

---

## Web preview (reference)

- **Interactive = a real `<button type="button">`** carrying the classes; its text content is the
  accessible name. Static = a `<div>` with no role and no `tabindex` — never a `<div>` dressed as
  a button, never a button with nothing behind it.
- **Glyphs** — the start slot, the end slot and the StackContainer are `aria-hidden="true"`; the
  portraits inside carry `alt=""`.
- **Truncation:** the ellipsis is CSS (`text-overflow`); the DOM keeps the full text, so the
  accessible name is the full note.
- **Focus ring:** `var(--sp-s2)` solid `var(--text-and-icon-primary)`, drawn inward
  (`outline-offset` minus `s2`) along the strip's own corners — the button family's ring.
- **No visual state on tap:** the notch has one state; the focus ring is the only drawn
  affordance, for the keyboard.
- **Reduced motion:** the slide and the band are DecorateContainer's, on
  `var(--transforming-state-slow)` / `var(--transforming-exit-slow)` — zeroed at the token, so the
  Notch appears and the band opens at once.
- **Hidden:** `visibility: hidden` at the end of the exit takes the button out of the tab order and
  the tree; the decorator slot itself carries no `aria-hidden` (the interactive-decorator
  exception).

### Colour and contrast

| Pairing | Tokens | Measured |
|---|---|---|
| Text on the fill (defaults) | `--text-and-icon-secondary` on `--background-base-grey` | ≈ 4.64:1 Day / ≈ 9.76:1 Night — passes AA for 14 px text, with thin Day headroom. `color-rules.md` still scopes Secondary to large text only — stale against the measured pair (the TariffCell precedent), flagged |
| Text on a re-pointed fill | `--notch-text` on `--notch-fill` | ≥ 4.5:1 in both themes — the instance that re-points either token re-checks the pair |
| Icons on the fill | `--text-and-icon-primary` on `--background-base-grey` | ≈ 15.7:1 Day / 21:1 Night — ≥ 3:1 non-text |
| Avatar border | `--border-default` | Decorative separation between overlapped squircles; no contrast duty |

---

## Machine contract — `specs/components/notch/capabilities.json`

Axes, allowed values, defaults, constraints and CSS/Figma bindings. Read this instead of guessing what the component can do.

```json
{
  "$schema": "../component-capabilities.schema.json",
  "id": "notch",
  "name": "Notch",
  "version": "3.0.3",
  "description": "A short strip docked on a card's top or bottom edge: an icon, a one- or two-line note and an optional chevron or avatar stack. Always the Slot#2 decorator of a DecorateContainer over the card; interactive (a button) or static.",
  "files": {
    "spec": "specs/components/notch/notch.md",
    "a11y": "specs/components/notch/notch-a11y.md",
    "preview": "src/notch.njk",
    "css": "src/shared/shared.css"
  },
  "figma": {
    "library": "🕹️ Oymyakon (components) — main file (merged from the branch WiWGOeTcDPnBYRPnMnAG73, node-ids unchanged)",
    "fileKey": "7vdl5YkZFDWvh9QvSmydsH",
    "componentSets": {
      "[Notch] 3.0": {
        "key": "ddfd19a77954e30e15740b269d8cf7fff8a38109"
      }
    },
    "capturedAt": "2026-10-19"
  },
  "root": {
    "class": "notch",
    "dataDsComponent": "notch"
  },
  "anatomy": {
    "row": {
      "class": "notch__row",
      "notes": "Figma's exposed RowContent: the parts at s4."
    },
    "startSlot": {
      "class": "notch__start-slot",
      "optional": true,
      "notes": "An IconContainer at s24 — discount-outlined in TextAndIcon/Primary by default; any DS icon."
    },
    "startText": {
      "class": "notch__start-text",
      "notes": "The note — Body/Compact Body in --notch-text; S one line, M up to two; the overflow ellipsizes."
    },
    "endSlot": {
      "class": "notch__end-slot",
      "optional": true,
      "notes": "chevron-right-small at s24 in TextAndIcon/Primary (the default; it makes the notch a button), or a .stack-container of Squircle Mini avatars."
    }
  },
  "axes": {
    "position": {
      "title": "Position",
      "type": "enum",
      "values": ["top", "bottom"],
      "default": "top",
      "css": {
        "modifier": ".notch--bottom",
        "mechanism": "top is the bare root (the two upper corners round s28); bottom rounds the two lower ones"
      },
      "figma": { "kind": "variant-property", "property": "Position", "values": { "top": "Top", "bottom": "Bottom" } }
    },
    "size": {
      "title": "Size",
      "type": "enum",
      "values": ["s", "m"],
      "default": "s",
      "css": {
        "modifier": ".notch--m",
        "mechanism": "s is the bare root: s32 high, one line; m keeps a s44 minimum and takes up to two lines; s4 vertical padding in both"
      },
      "figma": { "kind": "variant-property", "property": "Size", "values": { "s": "S", "m": "M" } },
      "constraints": [
        "M is the two-line size on s4 padding at a s44 minimum (owner, 2026-10-09); the merged Figma set allows two lines but still pads M s10 under the s44 cap — flagged."
      ]
    },
    "alignment": {
      "title": "Alignment",
      "type": "enum",
      "values": ["start", "center"],
      "default": "start",
      "css": {
        "modifier": ".notch--center",
        "mechanism": "start: StartText fills between the slots; center: the parts hug and centre as one group"
      },
      "figma": { "kind": "variant-property", "property": "Alignment", "values": { "start": "Start", "center": "Center" } }
    },
    "startSlot": {
      "title": "StartSlot",
      "type": "boolean",
      "default": true,
      "css": { "mechanism": "presence of .notch__start-slot" },
      "figma": { "kind": "variant-property", "property": "🔴StartSlot", "values": { "false": "Off", "true": "On" } }
    },
    "endSlot": {
      "title": "EndSlot",
      "type": "enum",
      "values": ["off", "icon", "stack"],
      "default": "icon",
      "css": { "mechanism": "presence of .notch__end-slot; its content is the chevron svg (icon) or a .stack-container (stack)" },
      "figma": { "kind": "variant-property", "property": "🔵EndSlot", "notes": "The boolean shows the slot; its Instance property swaps IconContainer | Avatars (the Avatars set ships as the StackContainer primitive)." },
      "constraints": [
        "icon (the chevron) requires interactive on — a chevron on a static strip promises an action that does not exist."
      ]
    },
    "interactive": {
      "title": "Interactive",
      "type": "boolean",
      "default": true,
      "css": {
        "modifier": ".notch--interactive",
        "mechanism": "on a <button type=\"button\"> root with the inward focus ring; a static notch is a <div class=\"notch\">"
      },
      "figma": { "kind": "none", "notes": "Not in the Figma set — an instance parameter (owner, 2026-10-09). No visual state on tap: the notch has one state." }
    },
    "fill": {
      "title": "Fill",
      "type": "token",
      "tokens": ["--background-base-grey"],
      "customizable": "any DS token (owner, 2026-10-09) — the instance re-checks the note's contrast at 4.5:1 or more",
      "default": "--background-base-grey",
      "css": { "customProperty": "--notch-fill" },
      "figma": { "kind": "none", "notes": "The set binds Background/BaseGrey; re-pointed by an instance override." }
    },
    "text": {
      "title": "Text colour",
      "type": "token",
      "tokens": ["--text-and-icon-secondary"],
      "customizable": "any DS token (owner, 2026-10-09) — 4.5:1 or more on the fill in both themes",
      "default": "--text-and-icon-secondary",
      "css": { "customProperty": "--notch-text" },
      "figma": { "kind": "none", "notes": "The CompactBody text binds TextAndIcon/Secondary; re-pointed by an instance override." }
    },
    "rtl": {
      "title": "RTL",
      "type": "boolean",
      "default": false,
      "css": { "mechanism": "dir=\"rtl\": the row mirrors; the chevron flips (:dir(rtl)); discount-outlined does not" },
      "figma": { "kind": "variant-property", "property": "RTL", "values": { "false": "Off", "true": "On" } }
    }
  },
  "states": {
    "default": ["standard"]
  },
  "analytics": {
    "dataDsComponent": "notch",
    "action": "tap",
    "notes": "Coverage unit. The root is the target when interactive; none when static. No internal targets — the chevron and the avatar stack are not separate targets. data-ds-variant = top|bottom, data-ds-preset = s|m, data-ds-state = standard."
  },
  "rtl": {
    "supported": true,
    "notes": "The row mirrors: StartSlot at the right, EndSlot at the left, the chevron points left; a StackContainer follows the reading direction."
  },
  "constraints": [
    "One state, Standard (owner, 2026-10-09): no pressed, hover, disabled or skeleton state, and no motion of its own.",
    "Never laid out on its own: the Slot#2 decorator of a DecorateContainer over the card — --h-stretch to the card's width, the band (.decorate-container--band + --dc-band = the notch's height) opening and closing with it, --slide on --transforming-state-slow / --transforming-exit-slow; the container carries the notch's fill and s28 corners; the card stays still — the band grows outward.",
    "The note is the accessible name; every glyph and the avatar stack are decorative.",
    "The Figma set merged into the main components file (2026-10-19); neither platform bridge carries it, so the manifest entry binds no node yet."
  ]
}
```
