From dcdc2b2d12dbd29437ae918507c73328122c772c Mon Sep 17 00:00:00 2001 From: rahim Date: Fri, 30 Jan 2026 17:19:59 +1100 Subject: [PATCH] docs(design): cross-reference feature-slice and feature-availability (#357) --- .../design/feature-availability-design.md | 22 ++----------------- internal/design/feature-slice-design.md | 4 ++-- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/internal/design/feature-availability-design.md b/internal/design/feature-availability-design.md index f32229f1..81756f59 100644 --- a/internal/design/feature-availability-design.md +++ b/internal/design/feature-availability-design.md @@ -38,11 +38,11 @@ type FeatureAvailability = 'available' | 'unavailable' | 'unsupported'; ## Related: Missing Feature vs Unavailable Capability -See [player-api](/rfc/player-api/index.md) for feature access patterns. +See [feature-slice-design](feature-slice-design.md) for feature access patterns. | Concept | Cause | Detection | | ---------------------- | ------------------- | --------------------------------- | -| Missing feature | Composition error | `hasFeature()` returns `false` | +| Missing feature | Feature not included| `slice === undefined` | | Unavailable capability | Platform limitation | `*Availability === 'unsupported'` | --- @@ -105,24 +105,6 @@ const volumeFeature = createFeature()({ Guards receive `{ target, signal }`, not state. Check capability on target directly. -### UI Usage - -```tsx -function VolumeSlider() { - const player = usePlayer(); - - if (!hasFeature(player, features.volume)) return null; - - const { volume, volumeAvailability } = player; - - if (volumeAvailability === 'unsupported') return null; - if (volumeAvailability === 'unavailable') return ; - return ; -} -``` - ---- - ## References - Media Chrome uses similar pattern with `*Unavailable` properties diff --git a/internal/design/feature-slice-design.md b/internal/design/feature-slice-design.md index 3ae449b1..4a619512 100644 --- a/internal/design/feature-slice-design.md +++ b/internal/design/feature-slice-design.md @@ -154,9 +154,9 @@ A thin lens over the store — flat access, scoped subscription: 3. **Layered API** — Primitive layer is generic, player layer is typed and convenient 4. **Familiar pattern** — Similar to Jotai atoms, Vue InjectionKey -## Alternatives Considered +## Related -See [`rfc/player-api/primitives.md`](../../rfc/player-api/primitives.md) for the proxy-level API. +See [feature-availability-design](feature-availability-design.md) for capability detection patterns. ## Files