docs(sema): audit selector-only menu rules

astra
dev 2 weeks ago
parent 313a261078
commit 81e67c49a7

@ -228,6 +228,10 @@ las dos reglas hápticas de selección de `item`; TagGroup mantiene después sus
reglas propias de retirada y reset. Los cuatro packs conservan sus Morfos y
selectores tipados. Calendar reutiliza esa misma pareja sobre `day`, sin
mezclarla con los eventos graduados de RangeCalendar.
El [barrido de reglas con sólo selector](./sema-selector-only.md) localizó 40
entradas en 22 packs. Se corrigieron comentarios obsoletos de ContextMenu y
DropdownMenu sin cambiar sus reglas; retirar las entradas requiere primero
decidir el contrato del catálogo exportado y caracterizar la firma resuelta.
## Eidos

@ -0,0 +1,61 @@
---
title: UIX — auditoría de reglas Sema sin firma
type: notes
audience: human + agent
authority: process — evaluación, no contrato de componente
status: reviewed
---
# Reglas de Sema con sólo selector
Fecha: 2026-09-24. Se releyeron las cuatro guías de componente y el contrato
de Sema. El usuario autoriza limpiar duplicación y errores sin cambiar el
comportamiento; `web/` queda fuera.
## Pre-flight: ContextMenu y DropdownMenu
| Característica | ContextMenu | DropdownMenu | Decisión |
| ----------------- | --------------------------------------------- | ---------------------------------- | ------------------------------------- |
| Apertura y cierre | `emerge-open`/`emerge-close` sobre `content` | Los mismos eventos sobre `content` | Conservar las reglas y sus selectores |
| Selección | `commit-select` sobre `item` con tap 0.3/12/0 | Idéntica firma, con Morfo propio | Conservar exactamente la firma |
| Disparador | Menú contextual | Botón dedicado | Mantener Soma y Morfo separados |
| Submenús | Familia por defecto | Familia por defecto | No añadir reglas ni cambiar eventos |
| Referencia oficial | Equivalente cercano | Diferencia pertinente | Decisión UIX |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------ | -------------------------------------- |
| [WAI-ARIA APG Menu Button](https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/) | Apertura y foco en menú | No prescribe sonido ni háptica | Conservar teclado y ARIA fuera de Sema |
| [Radix Dropdown Menu](https://www.radix-ui.com/primitives/docs/components/dropdown-menu) | Menú compuesto con submenús y foco gestionado | No define la firma perceptiva de UIX | No alterar partes ni estado |
| [Ark UI Menu](https://ark-ui.com/docs/components/menu) | Trigger de botón o contextual, ítems seleccionables | Modelo de estado distinto | Conservar los dos Morfos actuales |
| [Bits UI Dropdown Menu](https://bits-ui.com/docs/components/dropdown-menu) | Menú Svelte con ítems y grupos | Sin política Sema equivalente | Mantener la selección local |
Morfo posee eventos, partes, ARIA y teclado; Soma posee apertura, foco y
selección; Sema posee únicamente la proyección perceptiva; Eidos conserva
recetas, tamaños y variantes. Esta fase sólo corregirá los comentarios de los
dos packs. No se modifican sus arrays, API, DOM, CSS ni demos. El alcance
procede de las instrucciones vigentes del usuario de refactorización neutra.
## Hallazgo transversal
Un recorrido AST de los packs bajo `src/uix/sema/components/` encontró **40
reglas cuyo único campo es `selector`, repartidas en 22 packs**. En el resolver,
estas reglas no eligen nombre de sonido y `ruleAsOverride` entrega un objeto
vacío a `applyOverride`: no aportan valores a la firma efectiva. Sí siguen
siendo entradas del `Sema.cascade` exportado y el motor las recorre en cada
emisión que coincide. Por eso no se eliminan en esta fase. Su retirada exige
caracterizar la firma resuelta y decidir si la forma del pack exportado forma
parte del contrato de consumidores y herramientas.
ContextMenu y DropdownMenu tienen dos de estas reglas cada uno. Sus encabezados
atribuyen a esas reglas ajustes concretos de sonido; hoy el nombre y la firma
de sonido provienen de la tabla por familia/verbo/intención. La única firma
que estos packs añaden es el tap de `commit-select` sobre `item`. La suite
dirigida de censo, resolver y motor pasó 167/167 antes de editar, y ambas
auditorías de componente dieron PASS.
## Resultado de este lote
Se corrigieron sólo los encabezados de ContextMenu y DropdownMenu: ya no
atribuyen a sus reglas vacías ganancias, contornos o sonidos concretos que no
declaran. La suite dirigida pasó 167/167 después de editar y ambas auditorías
de componente siguieron en PASS. El diff elimina 30 líneas de comentarios; las
reglas exportadas, los selectores y la resolución de sonido y háptica no cambian.

@ -3,18 +3,11 @@ import { contextMenuMorfo } from '$uix/morfo/components/context-menu';
import type { Sema } from '../sema-map';
/**
* ContextMenu perceptual defaults — SOFT EMERGE + COMMIT.
* ContextMenu perceptual defaults.
*
* ContextMenu shares the event surface of DropdownMenu (emerge-open /
* emerge-close / emerge-open-sub / emerge-close-sub / commit-select), but
* the gesture is different: triggered by right-click or long-press on
* arbitrary content rather than by a dedicated trigger button. Frequency
* is bursty (one menu per investigative gesture) vs DropdownMenu's steady
* traversal, but the perceptual signature stays identical for system
* coherence — a user shouldn't have to learn two different "menu sounds".
*
* Strategy mirrors DropdownMenu — see `dropdown-menu.ts` for the
* doctrinal rationale.
* The open/close rules have selectors only; any sound comes from the family
* table. Committing an item adds the same light tap as DropdownMenu, using
* this component's own typed content and item selectors.
*/
const onContent = (matchers?: Parameters<typeof semaSelector<typeof contextMenuMorfo>>[2]) =>

@ -3,34 +3,11 @@ import { dropdownMenuMorfo } from '$uix/morfo/components/dropdown-menu';
import type { Sema } from '../sema-map';
/**
* DropdownMenu perceptual defaults — SOFT EMERGE + COMMIT.
* DropdownMenu perceptual defaults.
*
* DropdownMenu has five event surfaces:
* - `emerge-open` (emerge.open on `content`) — menu reveals
* - `emerge-close` (emerge.close on `content`) — menu retracts
* - `emerge-open-sub` (emerge.open on `sub-content`) — submenu reveals
* - `emerge-close-sub` (emerge.close on `sub-content`) — submenu retracts
* - `commit-select` (commit.select on `item`, affirm) — user picks a
* menu item
*
* Strategy (book cap. 22 §10 + cap. 26 emerge open/close discipline):
* - OPEN: `emerge.soft` (gain 0.08). The family.emerge.base.gain is
* 0.2 — too prominent for a menu the user opens dozens of times per
* session. Soft chime keeps the "menu appeared" cue without fatigue.
* - CLOSE: `emerge.exit.soft` — descending pitch (open ascends, close
* descends — same direction discipline as Dialog / Popover) plus
* gain 0.05. Even softer than open because closing is usually
* immediately followed by the item-select chime OR the surface the
* user navigated to.
* - SELECT: `commit.subtle` (gain 0.03) + light `tap` haptic.
* Softer than radio-group because the close emerge and the select
* commit usually fire together — two signals in quick succession
* would double-tap perceptually if both were at 0.05.
* - The morfo event carries `intent: 'affirm'`; pack does NOT override
*
* Sound is chosen, never authored: the family's verb table names it and the
* intent selects a variant. A rule here only appears when this component
* DIFFERS from that default — see `architecture/sema.md` §the sound pack.
* The content open/close rules have selectors only; any sound comes from the
* family table. Submenu events have no local rules. Committing an item adds a
* light tap, while the event's intent remains owned by Morfo.
*/
const onContent = (matchers?: Parameters<typeof semaSelector<typeof dropdownMenuMorfo>>[2]) =>

Loading…
Cancel
Save

Powered by TurnKey Linux.