You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/src/uix/eidos/components/toast/toaster.svelte

74 lines
2.3 KiB

<script lang="ts">
/**
* Eidos auto-mount `<Toaster>` — the ergonomic 90 % case.
*
* <Toaster {toaster} position="top-right" />
*
* Mounts Provider + Viewport + Item-loop with a default item template
* (status disc fed by `<IntentIcon>`, title, description, action,
* close). For exotic shapes — custom card layout, multiple toasters,
* compound trees in different DOM subtrees — the consumer drops down
* to `<Toast> / <Toast.Viewport> / <Toast.Item>` directly.
*
* The intent → glyph mapping lives in
* `$uix/eidos/components/icon/intent.ts` so any other surface that
* needs intent icons (Dialog, Field, Banner) reads from the same
* doctrinal source.
*/
import ToastComponent from './toast.svelte';
import Viewport from './toast-viewport.svelte';
import Item from './toast-item.svelte';
import Status from './toast-status.svelte';
import Main from './toast-main.svelte';
import Title from './toast-title.svelte';
import Description from './toast-description.svelte';
import Action from './toast-action.svelte';
import Close from './toast-close.svelte';
import IntentIcon from '$uix/eidos/components/icon/intent-icon.svelte';
import type { ToasterProps } from './types';
let {
toaster,
position = 'bottom-right',
gap,
label,
children
}: ToasterProps = $props();
</script>
<ToastComponent {toaster} {label}>
<Viewport {position} {gap}>
{#each toaster.toasts as item (item.id)}
<Item toast={item}>
{#if children}
{@render children({ item })}
{:else}
<Status>
<IntentIcon intent={item.intent} loading={item.loading} size="sm" />
</Status>
<Main>
{#if item.title}
<Title>{item.title}</Title>
{/if}
{#if item.description}
<Description>{item.description}</Description>
{/if}
{#if item.action}
<Action altText={item.action.label} onclick={item.action.onClick}>
{item.action.label}
</Action>
{/if}
</Main>
<!-- ToastCloseProvider's onclick already routes through
feat(morfo,sema,eidos): todo evento dice de que familia es, y el cruce por fin se ve El framework llamaba a la misma cosa de dos maneras: `open` pelado en ocho componentes y `emerge-open` en tres. No era estetica — un preset de movimiento engancha el nombre con `^=`, asi que el dialecto pelado no casaba con ninguna firma y simplemente no animaba, sin romper una sola prueba. Los 40 nombres sin prefijo pasan a `{familia}-{verbo}[-{matiz}]`: 256 eventos, 256 con prefijo, 0 ambiguos. El plan decia 36 y decia `handle-drag-start`; eran 40, y el canon (c25) dice que esos verbos son `pick` y `drop` — `handle-pick` y `handle-drop` ya existian en 10 y 4 componentes. `validateMorfo` cierra la puerta: un `events[].name` que no empiece por su familia ahora lanza. Visto fallar antes con un nombre pelado inyectado. Lo que el renombrado destapo, y va aqui tambien: - La receta del splitter enganchaba `commit-resize`, muerto desde `bd2e40366`. No casaba desde mayo y nadie chillo. Reescrita por FAMILIA, como slider y knob, y `eidos-lint` valida ahora el VALOR de `data-event*` contra el catalogo de morfos — el guard que lo habria cazado en su dia. - La familia `shift` era muda en el canal visual, contra su propia doctrina (c27: el cruce debe percibirse; c34 tipifica el «shift invisible»). Su mapa ya describia la firma que le faltaba y su sonido por defecto es `slide`. Ahora tiene firma direccional: sexto atributo del sello (`data-event-direction`, `forward`|`backward`, por emision) y deslizamiento de 320ms RTL-safe por `:dir()`. Medido: LTR -30px/+30px, RTL los invierte. - El sello de `shift-navigate` pasa del BOTON al `grid` en los cuatro calendarios. Medido: el boton recibia `contact-activate` y 8,5 ms despues —media trama— el `shift-navigate` pisaba la misma ranura y el `press-squeeze` moria sin pintar un fotograma. Una superficie, una ranura (A-36). - 101 contradicciones docs<->morfo adjudicadas con evidencia (git log, docs de decision, el componente vivo). Las docs desfasadas, corregidas; los nueve DEFECTOS de codigo obsoleto quedan abiertos y sin tocar. - `SoundDirection` -> `SoundContour`: era un contorno de tono, no un sentido, y habia tres cosas distintas deletreadas «direction». check en su linea base con 0 errores nuevos por diferencia de conjuntos · docs:check 0/0 · eidos-lint invalid 0 · el censo y las escenas de navegador medidas con raton real y rAF vivo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
runtime.trigger('emerge-dismiss') so Sema fires before the
toast leaves. Passing our own onclick here would race
ahead via mergeProps' handler composition. -->
<Close />
{/if}
</Item>
{/each}
</Viewport>
</ToastComponent>

Powered by TurnKey Linux.