diff --git a/src/uix/eidos/components/words/words-drawer.svelte b/src/uix/eidos/components/words/words-drawer.svelte
index 593e71aa2..209dee25d 100644
--- a/src/uix/eidos/components/words/words-drawer.svelte
+++ b/src/uix/eidos/components/words/words-drawer.svelte
@@ -12,7 +12,15 @@
* Modes are derived in soma (`WordsDrawerProvider.modes`); eidos
* just paints them.
*/
- import { ChevronRight, ChevronLeft, ChevronDown, ChevronUp } from '$uix/eidos/components/icon';
+ import {
+ ChevronRight,
+ ChevronLeft,
+ ChevronDown,
+ ChevronUp,
+ Pencil,
+ Check,
+ X
+ } from '$uix/eidos/components/icon';
import { Editable } from '$uix/eidos/components/editable';
import * as Words from '$soma/components/words';
import type {
@@ -557,10 +565,11 @@
{block.src}
Alt
-
+
+ {#snippet child({ props })}
+
+ {/snippet}
+
- Edit
- Save
- Cancel
+
+
+
+
+
+
+
+
+
Caption
-
+
+ {#snippet child({ props })}
+
+ {/snippet}
+
- Edit
- Save
- Cancel
+
+
+
+
+
+
+
+
+
{#if block.status}
diff --git a/src/uix/eidos/components/words/words.css b/src/uix/eidos/components/words/words.css
index 1df3d8fcc..dba16f7b9 100644
--- a/src/uix/eidos/components/words/words.css
+++ b/src/uix/eidos/components/words/words.css
@@ -376,6 +376,136 @@
text-transform: uppercase;
}
+/* Drawer-scoped Editable — Notion/Linear-style inline edit.
+ Resting state shows the preview with a faded pencil to its right
+ (revealed on hover or focus-within). Edit mode swaps to a textarea
+ (alt/caption can run long) with icon-only Submit (✓) and Cancel (✕)
+ beneath, right-aligned. Per the user's reference design. */
+[data-editable][data-words-drawer-editable] {
+ display: flex;
+ inline-size: 100%;
+ max-inline-size: 100%;
+ align-items: center;
+ gap: 0.25rem;
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-area] {
+ flex: 1 1 auto;
+ min-inline-size: 0;
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-preview] {
+ inline-size: 100%;
+ min-block-size: auto;
+ white-space: normal;
+ line-height: 1.35;
+ color: var(--words-toolbar-color);
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-preview][data-placeholder-shown] {
+ color: var(--words-status-color);
+ font-style: italic;
+}
+
+/* Pencil hides until the user signals intent (hover anywhere on the
+ editable row, focus-within, or focus on the preview itself). */
+[data-editable][data-words-drawer-editable] [data-editable-edit-trigger] {
+ flex: 0 0 auto;
+ inline-size: 1.5rem;
+ block-size: 1.5rem;
+ min-inline-size: 1.5rem;
+ padding: 0;
+ border: 0;
+ background: transparent;
+ color: var(--words-status-color);
+ opacity: 0;
+ transition:
+ opacity 120ms ease,
+ background-color 120ms ease,
+ color 120ms ease;
+}
+
+[data-editable][data-words-drawer-editable]:hover [data-editable-edit-trigger],
+[data-editable][data-words-drawer-editable]:focus-within [data-editable-edit-trigger] {
+ opacity: 0.7;
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-edit-trigger]:hover {
+ opacity: 1;
+ background: var(--words-command-hover-bg);
+ color: var(--words-command-active-color);
+}
+
+/* Edit mode: stack vertically. Textarea fills the row, action chips
+ sit beneath right-aligned. */
+[data-editable][data-words-drawer-editable][data-editing] {
+ flex-direction: column;
+ align-items: stretch;
+}
+
+[data-editable][data-words-drawer-editable][data-editing] [data-editable-area] {
+ inline-size: 100%;
+}
+
+[data-editable][data-words-drawer-editable] textarea[data-editable-input] {
+ inline-size: 100%;
+ min-block-size: 4.5rem;
+ resize: vertical;
+ padding: 0.4rem 0.5rem;
+ border: var(--words-border-width) solid var(--words-toolbar-border);
+ border-radius: var(--words-command-radius);
+ background: var(--words-bg, var(--words-toolbar-bg));
+ color: var(--words-toolbar-color);
+ font: inherit;
+ line-height: 1.35;
+ outline: none;
+}
+
+[data-editable][data-words-drawer-editable] textarea[data-editable-input]:focus-visible {
+ border-color: var(--_words-accent-border);
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--_words-accent-solid) 22%, transparent);
+}
+
+[data-editable][data-words-drawer-editable][data-editing] [data-editable-control] {
+ display: inline-flex;
+ justify-content: flex-end;
+ gap: 0.25rem;
+ margin-block-start: 0.35rem;
+}
+
+/* Icon-only submit / cancel chips. Square, compact. */
+[data-editable][data-words-drawer-editable] [data-editable-submit-trigger],
+[data-editable][data-words-drawer-editable] [data-editable-cancel-trigger] {
+ flex: 0 0 auto;
+ inline-size: 1.75rem;
+ block-size: 1.75rem;
+ min-inline-size: 1.75rem;
+ padding: 0;
+ border-radius: var(--words-command-radius);
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-submit-trigger] {
+ border: 0;
+ background: var(--_words-accent-solid);
+ color: var(--_words-accent-on);
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-submit-trigger]:hover {
+ background: color-mix(in srgb, var(--_words-accent-solid) 85%, white 0%);
+ filter: brightness(0.95);
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-cancel-trigger] {
+ border: var(--words-border-width) solid var(--words-toolbar-border);
+ background: transparent;
+ color: var(--words-status-color);
+}
+
+[data-editable][data-words-drawer-editable] [data-editable-cancel-trigger]:hover {
+ border-color: var(--words-threat-text);
+ color: var(--words-threat-text);
+}
+
/* Drawer header trail — shows the breadcrumb of stacked modes after
the leaf so the user knows what scopes are stacked underneath. */
[data-words-drawer-trail] {