diff --git a/continue.md b/continue.md index b64b2fc11..ac40660f9 100644 --- a/continue.md +++ b/continue.md @@ -120,24 +120,35 @@ asignado al `value` bindeado rompería los `$derived`). sobre el union V2, `exportWordsDocument` + `importDraftDocument` reescritos, prosa de la API-tab limpiada de striped/tone) -## Pendiente para mañana - -### Limpieza de huérfanos del drop D2 (fuera de scope de F6) - -Los literales de comando borrados (`toggle-table-striped`, -`toggle-table-compact`, `table-cell-tone-*`) todavía aparecen como -**selectores CSS huérfanos** en -`src/uix/eidos/components/words/words.css` y como menciones en docs -(README / `ARCHITECTURE_PROPOSAL.md` / este `continue.md` viejo). No -rompen nada (selectores muertos), pero conviene barrerlos. Audit: -grep `striped|compact|cell-tone` en `src/uix/eidos` + docs. +## Cerrado en la continuación (2026-05-29) + +### ✅ Limpieza de huérfanos del drop D2 + +Borrados los selectores CSS muertos de `words.css` +(`[data-command='table-cell-tone-*']`, `table[data-words-table-striped]`, +`[data-words-table-compact]`, `[data-words-cell-tone]` + focus-within, y +los `[data-words-cell-header]` huérfanos — los headers se renderizan como +``). README actualizado a la realidad V2 (tabla lista solo formato +vivo; HTML/MD export-only; import JSON + texto). `ARCHITECTURE_PROPOSAL.md` +intacto: documenta la *decisión* de eliminarlos, no features stale. +Verificado en browser (tabla 2×2 renderiza, `` conserva su tinte vía +`:where(th)`). Commit `4a0661a5`. + +### ✅ R5 — POLISH-1b (image visuals) + +El panel de imagen del drawer +(`eidos/components/words/words-drawer.svelte > imagePanel`) ya tenía radius +slider + shadow/border toggles. Añadido lo que faltaba: **shadow blur +slider**, **shadow color picker**, **border color picker** y **background +color picker**, vía un snippet reutilizable `imageColorField` (presets + +`` + clear opcional), mismo patrón que el color de texto +del panel format. Todos despachan `setBlockVisual` → `block.visual.*` → +`visualToStyle` → inline style en el `
`. Verificado en browser: el +panel renderiza los 4 controles nuevos; click en swatch de Background +actualiza el figure (`background-color:#22c55e`) preservando +radius/border/shadow (shallow-merge correcto). `npm run check` 0 errors. -### R5 — POLISH-1b (image visuals) - -Drawer image panel: sliders (radius, shadow blur), color pickers -(shadow color, borderColor, background), toggles (shadow, border). -La base existe: `setBlockVisual(blockIndex, patch)` ya es operación V2 -con whitelist P8. Falta el panel UI en el drawer + cablear el comando. +## Pendiente para mañana ### P1 — Drag handle FUERA del rail sobre bloques `` (heredado) diff --git a/src/uix/eidos/components/words/words-drawer.svelte b/src/uix/eidos/components/words/words-drawer.svelte index 2829f0680..4e688a6aa 100644 --- a/src/uix/eidos/components/words/words-drawer.svelte +++ b/src/uix/eidos/components/words/words-drawer.svelte @@ -829,6 +829,75 @@ Border + {@const shadow = 'shadow' in visual ? visual.shadow : undefined} + {@const shadowBlur = shadow?.blur ?? 12} + {@const shadowColor = shadow?.color ?? '#000000'} + {@const borderColor = 'borderColor' in visual ? visual.borderColor ?? '' : ''} + {@const background = 'background' in visual ? visual.background ?? '' : ''} + {#if hasShadow} +
Shadow blur
+
+ { + const b = next[0] ?? 0; + s.applyCommand({ + type: 'setBlockVisual', + blockIndex, + visual: { + ...visual, + shadow: { ...(shadow ?? { x: 0, y: 4, color: '#00000033' }), blur: b } + } + }); + }} + aria-label="Image shadow blur" + size="sm" + > + + + + {shadowBlur}px +
+
Shadow color
+ {@render imageColorField(shadowColor, '#000000', (v) => + s.applyCommand({ + type: 'setBlockVisual', + blockIndex, + visual: { + ...visual, + shadow: { ...(shadow ?? { x: 0, y: 4, blur: 12 }), color: v } + } + }))} + {/if} + {#if hasBorder} +
Border color
+ {@render imageColorField(borderColor, '#cccccc', (v) => + s.applyCommand({ + type: 'setBlockVisual', + blockIndex, + visual: { ...visual, borderColor: v } + }))} + {/if} +
Background
+ {@render imageColorField( + background, + '#ffffff', + (v) => + s.applyCommand({ + type: 'setBlockVisual', + blockIndex, + visual: { ...visual, background: v } + }), + () => + s.applyCommand({ + type: 'setBlockVisual', + blockIndex, + visual: { ...visual, background: undefined } + }) + )} {@const status = block.id ? s.imageStatus.get(block.id) : undefined} {#if status}
Status
@@ -841,6 +910,45 @@ {/if} {/snippet} +{#snippet imageColorField( + current: string, + fallback: string, + onPick: (value: string) => void, + onClear?: () => void +)} +
+ {#each COLOR_PRESETS as preset (preset)} + + {/each} + onPick((e.currentTarget as HTMLInputElement).value)} + /> + {#if onClear && current} + + {/if} +
+{/snippet} +