La brecha del dossier para este block, y la mayoría del formato: seis de siete en Tailwind Plus no son acordeón, sino una rejilla de preguntas y respuestas siempre abiertas. El eje vive en la LISTA, no en la raíz. Primero porque la lista es lo único que cambia —la cabecera se lee igual—, y segundo porque esa colocación es la que permite que el tipo diga la verdad: pasa a ser una unión discriminada. Bajo acordeón atraviesa toda la superficie del Accordion del canon; bajo lista no se ofrece ninguna de esas props, porque una rejilla estática no tiene estado abierto que enlazar, nada que colapsar ni modo simple o múltiple. Ofrecer una superficie y descartarla en silencio es justo lo que A-94 dejó dicho que no se hace, y aquí es donde iba a morder después. El ítem lee la disposición del contexto: no puede discriminar sobre la unión de la lista sin obligar a la app a repetir el arreglo en cada pregunta. Su value y su disabled quedan documentados como del acordeón, la misma convención que el fondo del hero y la media del cta. Y bajo lista la pregunta es un encabezado de verdad, porque ahí ES el encabezado de su respuesta; bajo acordeón el canon la mete dentro del disparador y esa semántica es suya, así que el block no inventa una segunda. Medido a 1280: en acordeón, cinco disparadores, ningún encabezado, medida de setecientos sesenta y ocho y respuestas ocultas hasta pulsar; en lista, ningún disparador, cinco encabezados, tres pistas de trescientos nueve, medida de mil veinticuatro y todas las respuestas visibles sin tocar nada. A 375 cae a una columna conservando ambas cosas. El acordeón queda idéntico. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>alpha-0.1-background
parent
50a7f47147
commit
f4ce006423
@ -0,0 +1,30 @@
|
||||
import { getContext, setContext } from 'svelte';
|
||||
import type { FaqLayout } from './types';
|
||||
|
||||
/**
|
||||
* What `Faq.List` shares with its `Item`s: the arrangement.
|
||||
*
|
||||
* The axis lives on the LIST, not on the root, because the list is the only
|
||||
* thing it changes — the header reads the same either way. That is also what
|
||||
* lets the type tell the truth: `FaqListProps` is a discriminated union, so
|
||||
* under `list` the accordion's surface (`type`, `collapsible`, bindable `value`)
|
||||
* is not even offered, instead of being offered and dropped (A-94).
|
||||
*
|
||||
* The `Item` cannot discriminate the same way — it would mean repeating the
|
||||
* arrangement on every question — so it reads it from here.
|
||||
*/
|
||||
export interface FaqContext {
|
||||
/** `accordion` (the default) or `list`. A getter, so reads track the source. */
|
||||
readonly layout: FaqLayout;
|
||||
}
|
||||
|
||||
const KEY = Symbol('uix.faq');
|
||||
|
||||
export function setFaqContext(ctx: FaqContext): void {
|
||||
setContext(KEY, ctx);
|
||||
}
|
||||
|
||||
/** The arrangement an `Item` should assume — `accordion` when used stand-alone. */
|
||||
export function faqLayout(): FaqLayout {
|
||||
return getContext<FaqContext | undefined>(KEY)?.layout ?? 'accordion';
|
||||
}
|
||||
Loading…
Reference in new issue