continuar-palabras.md: nueva sección 2026-07-16 — los 4 commits de la §6
element-específica (divider/code/quote/list/table/columns/callout), el fix del
callout (render <div>, no <aside>), y el DÓNDE RETOMAR de `doc` (la palanca #3)
con la arquitectura ya investigada (edita el PalabrasScheme, ruta styles.doc +
palette) y las dos preguntas de diseño a cerrar (mutación del esquema + activación
de la miga Documento).
ESTUDIO-PANELES.md Anexo: columns y callout marcados como cubiertos.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Columns §6: regla entre columnas (rule/ruleColor) y relleno de columna
(colPad) por la vía-var, re-declarando --palabras-scheme-columns-* inline
(cascada a los descendientes, cero CSS nuevo); gap concreto.
Callout §6: icono de intención (prop icon) — sello data-words-callout-icon
en el render + glifo ::before por intención (texto monocromo, hueco por
padding-inline-start). Toggle "Icono" en el panel de diseño + Ancla.
Fix del recipe del callout: apuntaba a aside[...], pero el editor renderiza
un <div>, así que el callout salía sin fondo ni borde de intención (el
esquema SÍ los define). Ahora selecciona por [data-words-block='callout'],
restaurando el look por intención en el editor.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- table: sección «Tabla» — Borde interior (composite, ruta-var) + Zebra (toggle).
El borde EXTERIOR ya lo da la sección común «Borde» (block.border → <table>).
- motor: TableBlock += borderInner (WordsBorder, estructural) + zebra (boolean);
tableStyle re-declara `--palabras-scheme-table-border-inner` inline en el <table>
(ruta-var → cascada a :where(td,th), cero CSS nuevo); render estampa
`data-words-table-zebra` cuando zebra.
- recipe: la regla de zebra (que ya existía muerta) se GATEA en el attr, con color
por defecto visible; el color de la banda es del esquema (→esc) vía nueva prop
PalabrasElementStyle.zebra + PROP_EMIT `zebra-bg`.
480/480 tests del motor · svelte-check limpio.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- list: sección «Lista» — sangría/interlínea por escala, marcador (glifo + color
de paleta) y casilla (tamaño + color), con visibilidad por tipo (`kinds`:
oculta los campos que no aplican en vez de deshabilitarlos).
- motor: props estructurales en ListBlock (indent/itemGap/marker/markerColor/box/
boxColor); listStyle compone indent como longhand y el resto RE-DECLARANDO la
var `--palabras-scheme-list-*` inline en el ul (targets en descendientes:
li+li, li::marker, li [role=checkbox]) → cero CSS nuevo.
- fix: listas de tareas ya no muestran bullet nativo (list-style:none + el marker
no se emite en check) — el checkbox es su marcador.
- pills apiladas: flex-wrap para que las 6 opciones de Lenguaje (code) no se
recorten.
480/480 tests del motor · svelte-check limpio.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Consolidación del editor palabras y su soporte en el motor Words.
Paneles específicos (§6 del informe ESTUDIO-PANELES):
- divider: grosor/estilo/color/ancho (props intrínsecas render->hr border-block-start)
- code: ajuste(wrap) · tab-size · cabecera de lenguaje en el lienzo
- quote: barra de acento (grosor + color de paleta) via border-inline-start
Comunes + palanca #1 (controles anclados a la escala/paleta del documento):
- sección «Borde» (grosor por escala + estilo + color de paleta + radio ~escala)
- text-transform («Caja») en Tipografía
- Tamaño -> escala tipográfica · Espaciado -> escala de espacios
Motor Words: props intrínsecas divider(height/lineStyle/width),
code(preWrap/tabSize), quote(barWidth/barColor) + textTransform como STYLE_KEY;
el render las compone como estilos inline que ganan a las vars del esquema.
Fixes:
- color-picker portaliza SOBRE el FloatPanel (--popover-content-z: 1100)
- imagen: sin doble borde (el figure usa el estilo sin-borde; el borde vive
solo en la <img> como pretende el reroute)
- wheel listener de CssField/NumberField solo cuando allowMouseWheel
480/480 tests del motor Words · svelte-check limpio.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Auditoria de la pregunta "respeta la transparencia todo el sistema": medido
por valores computados en navegador. El fill por capas lo hace correcto -
- identidades opacas (los 42 roles/escalas) -> acabado opaco (matchea el
solid de hoy);
- aurora/named = translucido POR DISENO (blobs color-mix(...,transparent)
sobre la base solida, alfa 0.62 medido) - la translucidez es el mecanismo;
- slots tinte (surface/track a2/a3) + variantes soft: el acabado es inerte,
su translucidez se preserva por no leerse;
- data-on inks: translucidos intencionales.
El unico borde (medido y documentado, no un bug del camino previsto): un
valor translucido forzado en el slot solid (no alcanzable por ninguna prop -
solid es la variante OPACA por definicion; la translucidez vive en los slots
tinte) hace que el color-mix hacia el ancla opaca suba el alfa (0.5 ->
0.545/0.631). La base background-color conserva su alfa, el elemento sigue
translucido en conjunto. Entrada fuera de contrato, no defecto - un framework
de referencia lo documenta en vez de dejarlo tacito (capitulo D2).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
D11 - Named finishes (el diseno A rescatado como opt-in explicito):
- gradientFinish.named opta gradientes del open cage como acabado, cada uno
con su tinta AUTORADA obligatoria (--gradient-{name}-ink, override de la
convencion --_{c}-fg a especificidad (0,3,0) sobre el slice de variante).
- La base sigue siendo el solid de la identidad (fill por capas, D2) -> el
aurora shipped son blobs de rol con alfa SIN color base final:
background-image-valido POR ARQUITECTURA (el caveat del mesh disuelto, no
exceptuado), y re-tine por tema y modo via referencias de rol.
- Honestidad documentada: la validacion numerica al peor stop de un string
CSS arbitrario no es implementable (stops desconocidos); posible solo para
gradientes de modelo (buildGradient) - diferida. El guard clava la sanidad
del config (named subconjunto de gradients + ink presente).
D12 - on/data-on minimo (Surface on="light|dark"):
- La foundation re-vincula --color-content-*/--color-border-default para el
subarbol (dark -> tinta on-solid; light -> on-solid-contrast; mixes oklch
82/64/32%). Verificado EN VIVO: un parrafo muted dentro del aurora computa
la tinta del contexto al 64%.
- Limites POR CONSTRUCCION y documentados en cada consumidor: componentes
anidados con tokens propios y contenido portaleado NO se re-entintan (la
inversion completa sigue siendo iniciativa independiente). forced-colors:
el contexto resuelve a CanvasText/GrayText (bloque extendido). Sin
color-scheme a proposito (solo chrome UA).
Ademas: prop gradient ampliada a (string & {}) para named en Button/Badge/
Surface; poda del orphan-guard (border/text de Surface: 3 slots x 8 colores,
lo que las variantes consumen); guard 5/5; audit 145/145; lab CASO 07 con el
aurora REAL (<Surface gradient="aurora" on="dark">) verificado por valores.
Docs: capitulo D11+D12 + registro D1-D12 + roadmap COMPLETO; reference p39;
changelog p42; plan cerrado (quedan declaradas: inversion completa, demo
propia de Surface, validacion de modelo para tintas named).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Box es layout-only por doctrina y rechaza background/color; Surface es la
primitiva que posee el lado del tratamiento: el caso hero / banda decorativa
/ bgGradient como primitiva de primera clase, no como escape-hatch style=.
- Composicion sobre <Box> (patron Section): hereda TODA la API de caja y
estampa data-surface + color/variant/gradient/rounded (attrs eidos-only de
wrapper, doctrina D8).
- Recipe palette-tint espejo de Card SIN chrome: _palette-* 5 slots x 8
colores -> el forward THM-2 ruta roles + 33 escalas donantes gratis
(verificado: color="teal" resuelve sin cableado extra).
- Variantes soft (tinte track, tinta global) y solid (lienzo saturado, texto
plano hereda contrast); gradient en el gate del acabado (rampa anclada +
spread; sin solid-hover -> extremo profundo cae a solid).
- Morfo declarativo patron Box (scope eidos, 1 parte, 0 eventos
justificados); eidos-lint invalid:0; audit 145/145 PASS (ficha completa:
Baseline/Decisiones/Gaps con disposiciones/Passive justification).
- Lab temas/gradientes CASO 07: heroes REALES con Surface (rampa primary,
spread plum, banda soft teal) verificados por valores computados; el
aurora nombrado queda como preview del siguiente paso.
Cola v2 restante: named finishes con tinta autorada + on/data-on.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Esta vez en el orden de la doctrina D6b: las dos puertas se midieron ANTES
de escribir la implementacion.
- Puerta 1 (sonda, 84 combos): la rotacion pura a L constante rompia grass
(+-4 grados) y gold (+-27) - L de OKLCH no es luminancia relativa. Rescate =
la propia doctrina aplicada suave: ambos stops rotados toman la mezcla
DEBIL del ancla (lift/3) -> 0 regresiones hasta +-45 grados.
- Puerta 2 (RCS en Chromium, por valores computados): el canal h de
relative color es <number> - calc(h +- 30deg) computa none -> el token
--gradient-finish-spread es SIN unidad ('30').
Shipped: gradient="spread" en Button+Badge (boolean | 'ramp' | 'spread';
data-gradient='spread' overridea la var del acabado - cero cambios de CSS de
recipe); token + override por tema (gradientFinish.spread); guard 4/4 con el
invariante del spread anclado; lab con especimenes reales (threat cruza el
360, gris C=0 queda ~plano - documentado, no caso especial); docs D10 en
theming/gradient-finish.md + reference p39 + changelog p42 + plan v1.5
completa.
Una doctrina, dos kinds: la rampa huye de la tinta con fuerza; el spread
huye suave mientras juega con el matiz.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ThemeDefinition.gradientFinish.lift: el tema re-emite --gradient-finish-lift
en su bloque (misma especificidad, despues en cascada -> el tema gana);
claro y oscuro pueden llevar intensidades distintas, 0% apaga por tema.
Test: active-eidos-config.test.ts ("per-theme gradient-finish dial override").
- Capitulo de nivel libro docs/theming/gradient-finish.md: registro de
decisiones D1-D9 con el porque de cada una, las alternativas rechazadas con
evidencia (color-value/variante/bg-prop; pasos 7/11 con valores reales;
lift-up global medido y tumbado 52/84), la rectificacion documentada y la
leccion de proceso (medir antes de fijar defaults). Indexado en docs/README.
- reference.md paragrafo 39 enlaza el capitulo; changelog paragrafo 42 y el plan
marcan la v1.x completa (guard + Badge + override por tema).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
El gradiente entra al sistema como ACABADO (material) del fill, jamas como
valor del eje de color: prop `gradient` -> attr eidos-only `data-gradient`
(familia data-variant; NO morfo - el runtime lo resolveria desde props de
soma y mergeProps clobberea el stamp del wrapper).
- Fill por capas: background-color = base solida (degrada sola en
forced-colors) + background-image = rampa derivada de los slots de LA
instancia (roles + 33 escalas + custom gratis, tinta heredada).
- Dial unico de tema: primitives.gradientFinish.lift (26%) ->
--gradient-finish-lift (0% = apagado; override por instancia via cascada).
- RAMPA ANCLADA a la sombra de la tinta ("la rampa huye de la tinta"):
tinta blanca -> #000 fuerte abajo (CTA sombreado); tinta oscura -> #fff
fuerte arriba (glossy). Ancla+angulo por color x modo con el MISMO flip
del slot contrast. Rectificacion MEDIDA: el lift global hacia blanco
rompia la tinta heredada en 52/84 combos a 26% (techo global 0%) - el
contraste ahora solo puede mejorar: dial sin topes.
- Guard ejecutable gradient-finish-guard.test.ts (3/3): no-regresion <=40%
sobre 84 combos + set flat-fail clavado (cyan/orange, deuda on-solid
preexistente).
- Generador emite la VAR (--_{c}-fill-finish); el recipe pinta (solid +
re-assert en hover: su shorthand background resetea el longhand).
- Lab temas/gradientes: 9 casos con componentes reales sobre el token real
(dial en vivo, polaridad observable, evidencia de pasos 7/11, forced-colors).
- Docs: capitulo theming/gradient-finish.md (registro de decisiones D1-D9,
alternativas rechazadas con evidencia, leccion de proceso: medir ANTES de
fijar defaults) + reference.md paragrafo 39 + changelog paragrafo 42 + plan
docs/process/gradient-finish-plan-2026-07.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Orden literal del usuario: fuera todos los ficheros que muestran la parte visual (panel, breadcrumb, handle, activate, drag, inserter, nav, segmented, color-row, spacing, typography, appearance, nav y el runtime de drag). Se CONSERVAN: el motor soma/words, types.ts, palabras-scheme(+parse+test), panel-schema, block-types/actions/anchor/image-file y los .md. index.ts reducido a contrato; la demo queda en stub honesto hasta la fase 1 de la reconstruccion ratificada. Check limpio en el track.
Orden del usuario ejecutada literal: palabras.css y palabras-chrome.css ELIMINADOS (imports fuera). El componente queda desnudo (solo los recipes propios de los componentes eidos compuestos). El desarrollo visual desde cero se hara por fases validadas por el usuario sobre sus mockups - no otra reconstruccion unilateral.
Orden del usuario: borrar todo rastro visual del componente y desarrollarlo
desde cero. Ejecutado:
- palabras.css REDUCIDO al documento (render del esquema: tipografia, tabla,
listas, codigo, callouts, imagen, columnas, marcas, seleccion). Todo el
chrome viejo MUERTO.
- palabras-chrome.css NUEVO, escrito de cero contra los dos mockups
ratificados (claude design): header con icon-tile en primary-surface +
titulo semibold; migas legibles en su propia linea (tambien en bloques de
primer nivel: Documento > Imagen); Tabs variant=segmented del catalogo con
pildora activa BLANCA y tinta primary (tokens themeables del recipe);
hairline bajo los tabs; controles de relleno suave sin borde en reposo
(borde solo en foco); pills en track hundido con pildora blanca activa
(full-width cuando apilan - Encaje); spacing con cabecera propia (label +
UN enlace) y 4 celdas SEPARADAS con captions; secciones bold con hairlines
entre items; sliders con valor en primary; footer blanco con el par de
flechas + "+ Insertar bloque" en primary; panel 304px, altura a contenido.
- Fix: el panel crece con el contenido y podia sacar el footer del viewport;
un observeResize lo re-sube cuando desborda (solo actua en overflow real).
- PalabrasSpacing: cabecera propia (label + enlace) por el prop `label`.
Verificado en Chrome real contra AMBOS mockups (panel Parrafo/Diseno con
Margenes/Relleno de 4 celdas + captions + enlace en cabecera; panel Imagen/
Diseno con Encaje full-width, Ancho completo, gated suaves, sliders con
valor violeta, footer). Suite y check del track limpios en la pasada previa.
El usuario senialo el panel de Elementor como el patron correcto. Adoptado
con nuestras piezas:
- PalabrasSpacing reescrito: UNA fila de 4 celdas px unidas (Arriba/Derecha/
Abajo/Izquierda, orden CSS) con hairlines compartidos y radios solo en los
extremos, captions DEBAJO de cada celda, y UN solo enlace para los 4 lados
(antes: 2 ejes x 2 steppers CssField + 2 enlaces - el doble de chrome para
la mitad de claridad). Vinculado (por defecto) una celda escribe block +
inline; separado, su clave per-side. Estado del enlace derivado de los
datos (cambiar de bloque lo resetea solo).
- Celdas = inputs nativos sobre los tokens del panel (mismo precedente que
data-palabras-text): commit en change/Enter, tabular-nums, foco con
z-index para que el anillo no lo coma la celda vecina.
- Controles compactos (switch / swatch / grupos de pills) anclan al borde
DERECHO de la columna de control (convencion del referente); los de texto
siguen llenando.
Verificado en Chrome real: Margenes/Relleno renderizan como el referente
(celdas 0|0|0|0 + enlace + captions), teclear 24 en Arriba con el enlace ON
escribe los 4 lados (computado 24px en los cuatro y style del motor con
block/inline start+end); el indicador de Tabs se recoloca al interactuar.
Suite palabras 11/11; check limpio en el track.
5o aviso del usuario: el panel no respetaba el ecosistema (fuentes/espacios/
superficies fuera de las escalas) y el grip colgaba FUERA del card. Purga:
- FUERA los overrides del FloatPanel: bg blanco, body padding a 0, min-height
400 (el vacio gigante en paneles cortos). El recipe del tema manda: surface
overlay, header raised, body padding space-3, titulo sm. Un panel de un
campo ahora es CORTO.
- Labels al patron canonico del ecosistema (recipe image-adjustments):
size-sm + font-weight-medium + content-secondary (14px computado).
- REGLA DURA descubierta tarde: --size-*-font-size son tokens de TALLA de
componente (xs=10px, PROHIBIDO como texto) — el suelo tipografico del panel
es --font-size-xs (12px). Migas, glyphs y captions del spacing corregidos;
verificado por valores computados (migas 12, labels 14, tabs 12, titulo 14).
- Migas = segunda linea de la BANDA del header (surface raised + hairline
unica debajo, sin doble borde via :has) — legibles, no un susurro.
- Tabs sin fitted y a xs (caben en una linea; a sm envolvian y el indicador
quedaba sobre el tab equivocado).
- Grip DENTRO del card: fuera el translate al margen; la banda es el padding
inline del contenido (space-8, mismo token que consumia words) y el grip
vive en ella pegado al bloque, como los editores de referencia.
- SALIDA A RAIZ desde una celda: la miga "Documento" (panel y superior)
activa el nivel documento — el panel muestra un estado Documento real cuyo
"Insertar bloque" ANIADE AL FINAL del documento (verificado: parrafo tras
la tabla, activo, panel siguiendolo). El menu de insertar es un snippet
compartido por ambos footers; doInsertType resuelve destino por loc.
Verificado en Chrome real pantalla a pantalla + valores computados.
Suite palabras 11/11; check limpio en el track.
Analisis UI ratificado (VISUAL.md, censo medido D1-D13) ejecutado con los
6 gates en la recomendacion:
- R1-R3 reticula de 2 columnas: etiqueta 92px + control fluido; DOS bordes
opticos (x=12 etiquetas/cabeceras/tabs, x=112 controles) en TODO el panel;
el control llena su columna (fuera anchos bespoke); switch/swatch anclan
al borde de control. Campos bloque (textarea/spacing/wide/pills>4) apilan
con la etiqueta arriba (data-stack).
- R2 escala {4,8,12,16}: fila 8, grupo 16, seccion 12.
- R4/G2 pills que no caben se transforman: Estilo = pills autodemostrativas
"Aa" (recta/cursiva/oblicua/tachada, glyph+glyphStyle en el contrato);
Nivel H1-HC apila; nada se recorta.
- G3 scroll en el CUERPO del tab (cabeceras acompanian; nada decapitado) +
scrollbar-gutter estable (el scroll ya no pisa controles) + fade inferior
solo-si-desborda (scroll-driven, degrada silencioso).
- G4 superficie unica: panel = surface de los controles (muere el patchwork
blanco-sobre-gris y el fondo del item abierto del accordion).
- R7 jerarquia unica: etiquetas muted xs, valores en tinta; cifras tabulares
en steppers.
- G6 migas EN la cabecera del panel (Documento - Tabla - Fila 2 - Celda -
Parrafo): acceso a los ancestros en el punto de uso; ancestros clicables,
actual tinta, documento contexto; solo en bloques anidados.
- G5 rail superpuesto: la columna de 32px muere; el grip flota en el margen
del card (translate -100%); el texto pasa de 57px a 25px del borde; el
grip ya no pisa el borde de la tabla en bloques anidados.
- Footer: par mover arriba/abajo junto + insertar al final (D10).
- Tipografia: una fila de reticula por propiedad; pares preset|manual DENTRO
de la columna de control; Peso y Tamanio en filas propias.
- Fixes cazados verificando: display:flex pisaba el hidden de tabs inactivos;
el clamp de posicion usaba PANEL_H=380 con paneles de 640 (ahora mide el
panel real - el footer ya no se sale del viewport).
- Limpieza: dbgChecked (TEMP debug) fuera.
Verificado en Chrome real pantalla a pantalla: reticula en Disposicion/
Tipografia/Colores/celda/encabezado; Aa escribe fontStyle=italic en el doc;
migas del panel navegan a Celda; panel entero en viewport; texto a 25px.
Suite palabras 11/11; check limpio en el track.
- Panel resuelve schema por KIND de ancestry (los nodos estructurales no
tienen type): paneles reales para table-cell (ancho, alineacion vertical,
alineacion, relleno, colores), table-row (alto, colores) y column (ancho,
colores); footer mover/insertar solo para bloques.
- Escalera Esc (INTERACCION L3): Esc sube parrafo -> celda -> fila -> tabla
-> documento; con panel abierto el primer Esc lo cierra (precedencia 3).
- La miga ya no cierra el panel al saltar de peldano (pointerdown
preventDefault -> el interact-outside del FloatPanel lo respeta): el panel
SIGUE la navegacion.
- Motor: renderTableRow aplica row.height (el modelo lo documentaba y el
render lo ignoraba); CSS mapea data-words-cell-vertical top/middle/bottom.
- Diseno sin caja-en-caja: el accordion-content pierde fondo y radio (la
caja de la seccion es el item, no un segundo recuadro dentro).
- Mensaje honesto cuando un nodo no tiene panel (no-props vs empty).
Verificado en Chrome real: miga completa Documento/Tabla/Fila 2/Celda/
Parrafo; panel Celda escribe valign=middle (attr + CSS computado); panel
Fila escribe height=64px (tr crece); panel Tabla llega por miga; Esc sube
los 4 niveles con el contorno siguiendo; Disposicion fluye plana.
Suites: words motor 468/468, palabras 13/13; check limpio en el track.
Revision con ojos (Chrome real, screenshots) de documento y paneles
tras "revisalo todo, esto es impresentable". Corregido:
1. ESPACIO MUERTO grip<->bloques: measure=68ch NO va en el esquema
default (el editor es superficie de ancho completo por decision FD.1
del usuario; measure queda como capacidad opt-in del esquema de la
app; el fix del carril pegado al texto se conserva para cuando un
esquema declare medida).
2. "Solo veo saturacion y desenfoque": la demo whitelisteaba los
ajustes para demostrar granularidad - una demo recortada parece
rota; la demo muestra el panel COMPLETO (8 sliders) y la
granularidad queda cubierta por los tests.
3. Caja-dentro-de-caja en el panel de imagen: fuera el label y el
marco del field "Ajustes" (el componente trae sus labels por
slider); el control fluye plano dentro de la seccion + respiro
space-3 respecto a los campos de encaje.
4. Sangria de listas corta: indent default 24->28px.
MIRADO al cierre: documento full-width con grip pegado al bloque
activo; panel Imagen = una sola caja Encaje/AnchoCompleto/Ancho/Alto/
8 ajustes; secciones Diseno limpias. Suite scheme 11/11.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ESQUEMA.md par.7-8 en el panel: la seccion ESPECIFICA de diseno del
elemento existe (Imagen: Encaje fill/fit/crop/tile + Ancho completo +
Ancho/Alto gated + AJUSTES = el componente ImageAdjustments del
framework COMPUESTO, no sliders reinventados) con mapeo componente<->
modelo (tono -100..100 <-> % 100+v; saturation<->saturate;
hue<->hueRotate; temperature 1:1 con la capa 3; neutro LIMPIA la prop);
la granularidad adjustments.* de editable pasa la lista de keys al
componente. Los fields declarativos del esquema (par.8b) entran a su
tab tras el filtrado (registry -> -editable -> +fields; seccion
"Esquema" en Diseno si tab=diseno). Avanzado del heading gana Ancla
(prop libre persistida; el TOC ya la lee). Demo: whitelist granular
(imagen = src/alt/fit/adjustments.saturation/adjustments.blur) + field
urgente en heading. VERIFICADO VISUALMENTE en Chrome real: la seccion
Imagen ofrece SOLO Saturacion y Desenfoque; mover Saturacion a -99
DESATURA la foto en pantalla (color -> B/N); Urgente con su switch en
Contenido; Ancla en Avanzado. Suites 550/550.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ImageBlock gana temperature (-100 frio .. 100 calido, 0 neutro) para
paridad con el componente ImageAdjustments (puerta ratificada de
ESQUEMA.md par.12.3): imageFilterCss compone calido->sepia(t%) y
frio->hue-rotate(t*0.3deg) (la misma aproximacion del componente y de
schemeImageFilter); validacion manual con signo (el helper compartido
rechaza negativos). +2 tests (validate rango/render composicion).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Correccion de proceso tras aviso del usuario: verificaba por valores
sin MIRAR - la tabla renderizaba a pelo (sin bordes/padding/cabecera)
porque su CSS murio con words.css. Verificado ahora VISUALMENTE en
Chrome real (screenshots + zoom), no solo por computed values.
palabras.css consume TODAS las rutas del esquema: doc (measure centrada
+ gap de ritmo + bg + selection + placeholder + caret) · text
(ls/ws/transform/numeric/indent) · TABLA (retirada digna: retícula
interior/exterior, cabecera bg+peso, zebra, padding de celda, ultimo
bloque de celda sin gap) · listas (indent/item-gap/marker/check-box) ·
code (tab-size/white-space + los 12 token kinds del highlighter) ·
callout x6 intents · imagen (radius/border/shadow/filter compuesto +
figcaption) · columnas (gap var + regla divisoria) · divider
(grosor/estilo/color/aire/ancho) · links (color/underline
width+offset/hover) · marks DESDE EL ESQUEMA (bold weight / code chip -
fuera los tokens del tema del host, doctrina backoffice) · quote.cite
(inerte hasta que el motor pinte la atribucion, anotado). textAlign
entra al contrato (align en notacion) con proyeccion logica DG-8.
MIRADO en Chrome real: tabla con reticula y cabecera, tokens de codigo
pintando (const rojo keyword, comentario gris), cita/vinetas/divider/
medida correctos, panel de Codigo con JS activo. Suite scheme 11/11.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ESQUEMA.md marcado RATIFICADO (propuestas de las puertas aceptadas).
Capa 1 de la implementacion: PalabrasElementStyle con las transversales
COMPLETAS (tipografia con tracking/word-spacing/transform/wrap/tabular,
espaciados y bordes POR LADO, sombra/opacity/measure) + las especificas
de cada elemento (doc/list+check/quote.cite/code+tokens/callout/image
con los 8 ajustes de ImageAdjustments/table/columns/divider/link/marks);
styles por RUTA abierta (quote.cite, callout.risk, mark.bold, plugins);
palette CON NOMBRE referenciable @nombre; fields declarativos del
disenador; editable granular con punto. Parser de la notacion compacta
(palabras-scheme-parse.ts) 1:1 con el objeto, tolerante a errores;
resolve acepta nombre|objeto|notacion y mergea por ruta; proyeccion
schemeCssVars de TODAS las props (tokens, underline split en
width/offset, filter compuesto de ajustes con la aproximacion de
temperature); lectores granulares (allowsField/subControls/extraFields).
+11 tests (parser/resolve/proyeccion/granularidad). Verificado en
navegador: 76 vars proyectadas, aislamiento intacto, rutas nuevas
presentes, el esquema custom de la demo sigue ganando.
PENDIENTE (capas 2-5, tracker): CSS consumidor completo de las rutas
nuevas, temperature en el modelo del motor, panel tres clases +
ImageAdjustments compuesto + fields/granularidad en UI,
register/extendPalabrasPanel, demo ampliada.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Par.7 nuevo: formalizacion de las tres clases de propiedades (especificas
semanticas -> Contenido; comunes transversales -> Diseno primero;
especificas de diseno del elemento -> seccion propia en Diseno;
Avanzado = ancla/flags). Par.8 nuevo: extension de paneles en dos
niveles - programador (registerPalabrasPanel para tipos plugin +
extendPalabrasPanel add/remove/posicion sobre existentes) y disenador
(el esquema QUITA con editable y ANADE con fields declarativos sobre
props libres que el motor ya persiste, sin codigo); orden fijo
registry -> -editable -> +fields. Renumeracion 9-12 + puertas nuevas
en la ratificacion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
La fila image del inventario gana los 8 ajustes canonicos del componente
ImageAdjustments (brightness/contrast/saturation/temperature/hue/blur/
grayscale/sepia): el esquema declara sus defaults, editable los gobierna
granular (adjustments.*), y el panel COMPONE el componente (regla #1).
Puerta nueva en par.10: mapeo motor<->componente (el modelo dice saturate/
hueRotate y no tiene temperature - propuesta de anadirla al motor).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
8-step path distilled from how RotateAlign/Clock were actually built (morfo ->
langs -> soma provider vs the ChallengeHost -> telemetry block -> sema pack ->
eidos skin -> anti-bot tests -> demo+gates) + the non-negotiable invariants
(challenge never owns the verdict, no network inside, random per instance).
Also refreshed the stale bits: the orchestrator README now names both shipped
challenge engines and documents the rotation telemetry block alongside
pathAdherence; eidos README points to the recipe.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Inventario elemento a elemento (doc/text/h1-6/list/quote/code+tokens/
callout por intent/image+caption/table+cell+header+zebra/columns/divider/
link/marks/plugins) x dimensiones transversales completas; fonts/palette
con nombre y @referencias; editable con granularidad de sub-control;
gramatica de la notacion compacta mapeada 1:1 al objeto; proyeccion de
cada pieza; estado actual vs spec (lo hecho es base parcial); puertas de
ratificacion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
El esquema es el contrato COMPLETO del documento (definicion del
usuario): fuentes admitidas (pueblan el dropdown Familia), tamanos por
elemento tipografico (text/h1..h6/quote/code), presets de colores (los
swatches del ColorPicker), propiedades EDITABLES por elemento (lista
blanca que gobierna el panel: tipo declarado ofrece SOLO esos campos) y
estilos base por elemento. schemeStyle acepta nombre registrado u
objeto inline (parcial rellena del default); registro via
registerPalabrasScheme. DOCTRINA backoffice: el documento renderiza de
SU esquema, nunca del tema de la pagina anfitriona - el default es
autocontenido (stacks web-safe, cero var() del tema), las vars
--palabras-scheme-* se estampan en el doc root y palabras.css define
familia/tamano/interlineado/color EXPLICITOS (fuera la herencia del
host y fuera los --style-h{n} del tema que usaban los headings). El
panel muere el proxy getComputedStyle: blockDefaultPx y effectiveColor
leen el valor REAL del esquema; nueva seccion Colores (texto/fondo)
con la paleta como presets. Demo con esquema inline de ejemplo.
Verificado por valores en navegador: content Georgia-17 con host en
Times (aislado); h1=34 del esquema custom; quote con color/borde del
esquema; panel de imagen solo ofrece la whitelist (sin caption);
picker con los 5 presets exactos de la paleta.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- soma: targetSnapDeg knob quantizes the random target bearing (the clock
needs hour-aligned targets: a free bearing misses the marked hour by up to
15deg vs the 8deg tolerance ~47% of the time); default off, unit-tested.
- eidos: clock.svelte + clock.css - face (11 ticks, numbers at 3/6/9,
accent target-hour badge), cuckoo house at 12 (roof, doorway, swinging
doors, sill), FRONT-facing messenger pigeon with the letter, hour hand.
Verified-state dispatch (doors swing -> peek -> hold -> fly) as bespoke
content choreography, every @keyframes annotated functional: per R-4.5;
sill occlusion via clipPath; outer/inner SVG transform split; fulfill
recolor on verdict; reduced-motion = static doors open + peek.
- exported ProofOfHuman.Clock + ClockProps; eidos README challenge list.
- demo: Clock chip reusing the rotate knobs; clock idle instruction; the
success card waits 3.3s for the cuckoo; corner stage-pigeon suppressed in
verifying AND verified for the clock (the cuckoo IS the pigeon). Includes
prettier normalization of the demo page.
- handoff doc rewritten: clock shipped; filming/throttling gotchas recorded.
Verified: 81/81 tests (poh scopes), component:audit 144/144 PASS, svelte-check
clean on touched files, end-to-end solves in real Chrome (light + dark).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fase A de la migracion i18n: bundle langs/components/palabras.ts
(~75 claves es/en) + registro en componentLangs. Los labels /
placeholders / titulos de seccion / options traducibles del panel-schema
y de la rejilla de tipos viajan como refs #?components.palabras.*|fallback
y se resuelven con eidos.langs.ts() al render (reactivo al locale):
panel (labels de campo, tabs, arias, footer mover/insertar, empty,
pending, titulo/header), breadcrumb (crumbLabel gana parametro ts),
grip (aria propiedades), inserter de columna, y los seeds de insercion
(Titulo/Elemento). La notacion universal (H1-H6, JS/TS, 1. a. A.) queda
literal a proposito. PENDIENTE declarado: fase B = palabras-typography
(~45 labels del mega-control); palabras-appearance EXCLUIDA (legado a
extinguir). Verificado en navegador real con el picker del topbar: el
panel abierto re-etiqueta EN VIVO (Documento/Encabezado/Contenido/... ->
Document/Heading/Content/Level/Text/Link).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
morfo/components/palabras.ts: scope ['eidos'], CERO eventos (composicion
presentacional - los eventos perceptuales son del morfo del MOTOR words,
cuya recipe eidos ES palabras), 43 parts con el censo REAL de
data-palabras-* que el chrome emite (frame shell/stage/canvas/doc/rail ·
grip handle/-slot/-menu/insert-grid · breadcrumb · column-inserter ·
panel FloatPanel + campos generados · appearance legado mientras siga
montado). data-palabras (provider) ya lo estampa Words.Provider en la
raiz. Deuda anotada en el docstring: 12 attrs solo-CSS del panel viejo
(reglas muertas pendientes de barrido autorizado). Verify del plan:
validateMorfo pasa (gotchas: defaultElement sin 'p'; kind es
public|private|virtual, no 'internal') + eidos-lint palabras = 60
morfo-backed / 96 eidos-only / 0 INVALID. +2 tests.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Entradas nuevas en panel-schema.ts: quote (texto+fuente/cite) · code
(texto + lenguaje pills de los 6 que el highlighter tokeniza) · callout
(intent requerido con labels web + titulo) · list (kind + start +
numeracion, los campos F4.4) · table (fila/columna de cabecera) ·
columns (separacion/gap; el count necesita comandos de motor - fuera a
proposito) · divider (solo Diseno). Seccion compartida disposicion-
espacio (sin align) para divider/code/columns. Fix del renderer: la
rama 'toggle' estaba VACIA (hueco de un debug previo) -> repuesta
componiendo el <Switch> de eidos (checked + onCheckedChange; false
limpia la prop). Verificado en navegador real tipo a tipo con flujos
reales: cite persiste; pill TS -> tokens de highlight; start=5 por
triggers del NumberField + type=a en el <ol>; headerRow -> 2 <th>;
callout con titulo + data-words-callout-intent=risk; gap:24px en el
style del bloque columns; divider abre con Contenido vacio. El filtro
anti-anidamiento de Columnas en la rejilla confirmado de paso.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Firma del usuario ("todo si, directamente a la version 2"): la spec de
interaccion pasa a contrato ejecutable de F3/F4. Resolucion de los
warning de par.8: ensayo (preview hover/focus) y pin del panel -> v2;
mapa de atajos y burbuja-touch-barra ratificados tal como propuestos.
DG-14 resuelta: sin toolbar (contextual-only). DG-13 queda como puerta
de FD.3 (el mood se elige antes de vestir chrome nuevo). Tabla DG y
preambulo del tracker actualizados.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full self-contained handoff for a fresh session: architecture, both shipped
challenges (PathTrace + RotateAlign), the clock-skin spec (cuckoo + front-facing
pigeon, from the iterated mockup), the SVG transform-override gotcha, the
concurrency warning (another session on the same branch), verification-env
gotchas, and the commit list.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bitacora #3 en continuar-palabras.md (embed-plugin + counts/TOC +
align logico: commits, fixes de motor destapados, aviso del indice git
compartido entre sesiones) y PLAN-EJECUCION.md actualizado (preambulo +
tabla F4: F4.5 y F4.8 completos, F4.7 mitad motor, F4.6 pospuesta
entera a post-FD por ser chrome sin spec firmada).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A second pluggable challenge over the same orchestrator: rotate a needle onto a
per-instance RANDOM bearing and hold it steady until it settles. Composes
Gesture.rotate. Pointer OR arrow keys feed the same angular telemetry (new
`rotation` block); the settle dynamics are the non-replayable signal, so a
two-key script can't solve it.
- morfo `rotate-align` (Provider + Dial + Needle; handle-*).
- soma provider (settle-to-lock via uix.timers; detent tick per 30deg; unwrapped
visualAngle for a seam-free transition; re-arm + auto-focus like PathTrace).
- sema pack; eidos `ProofOfHuman.RotateAlign` compass skin (dial + mailbox target
+ magnetically-settling needle).
- demo: challenge switcher (PathTrace | RotateAlign) + rotation telemetry rows.
Also fixes PathTrace `difficulty` doing nothing after mount (curve now
regenerates on difficulty/seed change while idle).
Verified: 25/25 tests + end-to-end in real Chrome.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Decision DG-8 registrada: el MODELO conserva alineacion fisica
(left/right, universal como las referencias); blockStyle proyecta a
text-align logico (start/end) en el UNICO punto compartido por el
render del editor y serialize-html, asi un documento RTL alinea
coherente sin tocar el contenido almacenado. Identico bajo LTR.
+2 tests (537/537). Verificado en navegador real con el flujo del
panel: toggle Derecha -> style text-align:end; geometria LTR pega el
texto a la derecha y bajo dir=rtl el mismo documento lo pega a la
izquierda (end volteado coherente).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
El snippet del provider gana wordCount (tokens whitespace Unicode de
plainText), charCount (code points sin separadores de bloque) y
tableOfContents (outline de headings en orden de documento: top-level +
callouts + columnas, celdas de tabla excluidas a proposito; cada
entrada con level/text/anchor del panel/id estable/path para navegar).
Fix de motor que el test destapo: renderWordsPlainText IGNORABA las
columnas (texto perdido en copy plano, exportContent('text') y counts)
-> walker recursivo de contenedores, callout anidado ahora consistente.
El widget visual (Status/TOC UI) = F3 post-FD. +1 test (535/535).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Prueba de fuego del API de plugins. Core gana la pieza generica que
faltaba: spec.fromPastedUrl + registry.blockFromPastedUrl (el paste de
una URL sola consulta el registry ANTES de linkificar), tag iframe en
el vocabulario de render, y FIX real que la prueba destapo: normalize
dropeaba a undefined los bloques de plugin (switch cerrado sobre los
built-ins) corrompiendo el documento -> normalizacion generica (id +
shape intacto). El plugin (plugins/embed.ts, NADA lo importa desde el
core): iframe sandbox con src DERIVADO del url por el provider
matcheado; allowlist DG-9 configurable (YouTube/Vimeo/X/CodePen por
defecto); provider fuera de la lista -> parrafo inerte, nunca iframe;
markdown lossy = url plano. La demo de palabras lo registra en boot.
+6 tests (534/534). Verificado en navegador real: pegar URL de YouTube
-> iframe youtube-nocookie sandboxed, sin linkificar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bitacora nueva en continuar-palabras.md (F4.1-F4.4 motor: commits,
verificaciones, notas tecnicas para no re-descubrir) y estado F4-motor
en el preambulo de PLAN-EJECUCION.md + tabla F4 marcada (F4.1/F4.2
completos; F4.3/F4.4 motor hecho, chrome post-FD).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ListBlock gana start (entero >= 0, default 1) y numbering ('1'|'a'|'A'|
'i'|'I', default '1') — solo significativos en kind ordered, conforme a
DG-7 (flat+indent se mantiene). Validador con vocabulario
WORDS_LIST_NUMBERINGS; render y serialize-html emiten los attrs NATIVOS
<ol start type> (el navegador numera, cero CSS); parse-html los lee
(round-trip); markdown desplaza los ordinales con start y documenta
numbering como lossy. normalize ya los conserva ({...block}). +4 tests
(528/528). Verificado en navegador real: paste de <ol start=3 type=a>
-> attrs presentes y computed list-style lower-alpha.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>