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 +`
` (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}
+