`data-event-*` es UNA RANURA por elemento. Tres auditorias independientes encontraron el mismo defecto y ninguna lo cerro: fable S1 (2026-07-01, con el README diciendo «findings executed»), sema S-17 (2026-08-05, midio el estampado del knob muriendo a los 24ms de un hold de 240) y blocks A-36/A-65 (reproducido en navegador, dos estampados a 1,1ms). Lo que faltaba no era diagnostico: nadie podia distinguir una redireccion legitima de una deriva, porque la opcion que redirigia se llamaba `fallbackTarget` y hacia lo contrario de lo que decia. EL NOMBRE PRIMERO. `fallbackTarget` -> `targetOverride` (202 apariciones, 64 ficheros, dirigido con `git ls-files`). Siempre GANO sobre el ref registrado; el nombre honesto es la precondicion para auditarlo. Las cronicas conservan el viejo por diseño. LA PROPIEDAD. `unstampEventAttrs` recibia el signal y lo DESCARTABA, asi que la ocurrencia que terminaba antes borraba a la que tenia la ranura. Ahora comprueba `data-event-id`. Con eso, `replace` deja de ser el comportamiento roto y pasa a ser el suelo correcto. A-36, SIN `regime`. Los cuatro overlays cedian el estampado del `open` al trigger por un workaround de la era `sequence: 'pre'`; con `post` el content ya esta montado. Retirado el override (float-panel migrado `pre`->`post`, ultimo fuera de la doctrina que sema.md escribe). Medido en /blocks/site-header/preview a 375px: contact-activate en el TRIGGER +18,7ms y open en el CONTENT +20,6ms, con press-squeeze y slide-from-right-full corriendo. Antes: los dos en el trigger, press-squeeze jamas. `regime` DEFINIDO — y son dos valores, no cuatro. `replace` (default) y `queue`, este solo para las 4 parejas irreducibles: los tres toggles (el provider ES el boton) y el knob. `collapse` retirado (su caso murio con la propiedad: medido, 0 huecos en 5 emisiones a 72ms) y `lock` retirado (significaria «un cierre que no se anuncia»), con sus 4 declaraciones muertas. El guard de `queue` PASO EN VERDE SIENDO INCORRECTO: con timers falsos no hay animaciones, asi que awaitExpression volvia al instante. El navegador midio el commit encolado llegando 1,6s tarde. `queue` espera el HOLD, no la expresion. Medir la envolvente no es medir la salida. `renderAttrs` — los attrs que no son partes. Vaciar ACTIVE_DEV_TRACK (palabras y chronos ya no estan excluidos) destapo 23 `data-palabras-*` que ningun morfo declaraba y que palabras.css SI estiliza: aterrizan en el arbol que el usuario escribio, asi que no pueden ser partes. Campo nuevo con la linea afilada —si el consumidor puede componerlo, es una PARTE— y 3 consumidores (palabras, waveform, aura). Declarado en types.ts Y en el esquema sium: la leccion de MorfoElement. Ademas: 5 selectores muertos en el predicado del focus-scope de palabras (barrido de todo el repo: aparecian solo ahi) · RTL-1 real en palabras-chrome (inset logico + translate fisico = doble volteo; rtl:check 1->0) · el union inline al `Direction` canonico, que destapo que el censo de direccion grepea el NOMBRE del tipo · deuda de chronos (scope, barrel, README). Y de la cola: S-36 (barrel 68->71 + guard), S-31 (vibrate(NaN)), S5 (la preferencia de reduced-motion del usuario ya gana a los channels del morfo), SO2 (el warn que el JSDoc prometia), SO4 (validar el target antes del prewrite). Todos los guards nuevos vistos fallar antes de arreglar nada. Base: check 74 (= base) · sema+morfo+contracts 454 verdes / 6 ajenos preexistentes · soma navegador 1258/1259 (el rojo es un timeout ajeno, reproducido con los cambios en stash) · docs:check 0/618 · rtl:check 0/177. Handoff: docs/process/CONTINUE-perceptual-surface.md Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>alpha-0.1-dir-prefs
parent
49362d89e9
commit
b1b48fb3aa
@ -0,0 +1,100 @@
|
||||
# Chronos
|
||||
|
||||
Headless **event calendar** (scheduler). Not a date picker: cells host event
|
||||
chips, chips are draggable / resizable, and the component owns an editor (a
|
||||
reused Dialog) plus an undo/redo command stack.
|
||||
|
||||
The contract is declared in
|
||||
[`morfo/components/chronos.ts`](../../../morfo/components/chronos.ts) — this
|
||||
README documents the soma surface only. Design and competitive rationale live in
|
||||
[`eidos/components/chronos/SPEC.md`](../../../eidos/components/chronos/SPEC.md).
|
||||
|
||||
## Anatomy
|
||||
|
||||
```svelte
|
||||
<Chronos.Provider bind:events bind:view bind:focusedDate>
|
||||
<!-- toolbar: navigation + undo/redo + the period heading -->
|
||||
<!-- grid (month) | time-grid (week/day) | agenda — one per `view` -->
|
||||
</Chronos.Provider>
|
||||
```
|
||||
|
||||
The eidos root ([`<Chronos>`](../../../eidos/components/chronos/chronos.svelte))
|
||||
composes the parts; consumers use that root rather than assembling the grid by
|
||||
hand.
|
||||
|
||||
## Parts
|
||||
|
||||
Grouped by the view that renders them. `Provider` is the ARIA `application`
|
||||
root; the three view bodies are mutually exclusive.
|
||||
|
||||
| Group | Parts |
|
||||
| --- | --- |
|
||||
| Root | `Provider` |
|
||||
| Toolbar | `Toolbar` · `PrevButton` · `NextButton` · `TodayButton` · `UndoButton` · `RedoButton` · `Heading` |
|
||||
| Month grid | `Grid` · `GridHead` · `HeadCell` · `GridBody` · `GridRow` · `DayCell` · `DayNumber` · `EventChip` · `EventResizeHandle` · `MoreLink` |
|
||||
| Week / day | `TimeGrid` · `AllDayRow` · `DayColumn` · `TimeSlot` · `HourLabel` · `NowIndicator` |
|
||||
| Agenda | `Agenda` · `AgendaGroup` · `AgendaItem` |
|
||||
|
||||
## ARIA
|
||||
|
||||
Chronos implements the WAI-ARIA
|
||||
[Grid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/).
|
||||
|
||||
| Part | `role` |
|
||||
| --- | --- |
|
||||
| Provider | `application` |
|
||||
| Grid · TimeGrid | `grid` |
|
||||
| GridHead · GridRow · DayColumn | `row` |
|
||||
| HeadCell | `columnheader` |
|
||||
| GridBody | `rowgroup` |
|
||||
| DayCell · TimeSlot | `gridcell` |
|
||||
| EventChip · MoreLink · AgendaItem · the five toolbar buttons | `button` |
|
||||
| AgendaGroup | `group` |
|
||||
|
||||
## Keyboard
|
||||
|
||||
On the month grid (`Grid`):
|
||||
|
||||
| Key | Action |
|
||||
| --- | --- |
|
||||
| `ArrowLeft` / `ArrowRight` | previous / next day |
|
||||
| `ArrowUp` / `ArrowDown` | previous / next week |
|
||||
| `PageUp` / `PageDown` | previous / next month |
|
||||
| `Home` / `End` | first / last day of week |
|
||||
| `Enter` · `Space` | create an event, or open the focused one |
|
||||
|
||||
On the time grid (`TimeSlot`): `ArrowUp` / `ArrowDown` move by hour,
|
||||
`ArrowLeft` / `ArrowRight` by day.
|
||||
|
||||
## Semantic events
|
||||
|
||||
Declared in the morfo and shipped with a sema pack
|
||||
([`sema/components/chronos.ts`](../../../sema/components/chronos.ts)).
|
||||
|
||||
| Event | Family · verb | Target |
|
||||
| --- | --- | --- |
|
||||
| `shift-navigate` | `shift` · `navigate` | `provider` |
|
||||
| `commit-save` | `commit` · `save` | `event-chip` |
|
||||
| `commit-move` | `commit` · `move` | `event-chip` |
|
||||
| `commit-delete` | `commit` · `delete` | `event-chip` |
|
||||
| `commit-restore` | `commit` · `restore` | `provider` |
|
||||
| `commit-apply` | `commit` · `apply` | `provider` |
|
||||
| `handle-drag` | `handle` · `drag` | `event-chip` |
|
||||
| `handle-resize` | `handle` · `resize` | `event-resize-handle` |
|
||||
|
||||
> **Known gap (audit S-37, 2026-08-05):** the pack ships rules for `handle-drag`
|
||||
> and `handle-resize`, but no provider emits either — direct manipulation is
|
||||
> currently perceptually silent. Either the provider emits them when it
|
||||
> translates the reused drag-drop into commands, or the two rules retire.
|
||||
|
||||
The editor's open/close is **not** declared here: it is a reused Dialog, and the
|
||||
`emerge` pair belongs to Dialog's own morfo. Chronos only orchestrates when the
|
||||
Dialog opens.
|
||||
|
||||
## Notes
|
||||
|
||||
- Undo/redo are `commit-restore` / `commit-apply` (both canonical `commit`
|
||||
verbs): restore re-applies the previous snapshot (neutral), apply re-applies
|
||||
the undone one (affirm).
|
||||
- The reusable brain (month-grid maths + the dual-axis overlap solver) is
|
||||
exported from `exports.ts` as a pure, DOM-free surface.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue