feat(web): ventana de formulario SBO (toolbar, título con estado, pestañas, menús y barra de estado)

- sbo-window: título con insignia de estado, cuerpo, zona de acciones
  (sboActions / sboActionsEnd) y barra de estado ok / warn / err / info con
  role="status".
- sbo-toolbar con botones .tb y sbo-icon (SVG en línea).
- sbo-tabs / sbo-tab: paneles ocultos conservan su estado, [(selected)],
  flechas izquierda/derecha con foco, roles y aria-controls.
- sbo-menu-button: lista de acciones ("Copiar de/a") que abre hacia arriba o
  abajo; Esc y clic fuera la cierran; opciones deshabilitables.
- sbo-badge compartido con las listas (data-table lo usa); tono 'info'.
- Verificado en Chrome contra el mockup oferta_venta.html: misma estructura,
  pestañas por clic y teclado, menú hacia arriba, estados ok/err.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-13 20:09:41 -05:00
1 parent fad66abec4
commit 26f0649da9
16 files changed
+768 -25

No files matched your search

+32
View File
@@ -135,3 +135,35 @@ Lista con **barra de filtros** y **búsqueda por columna**, igual que el mini-er
- Entradas: `title`, `resource`, `columns`, `filters`, `extraFields`, `baseFilter`, `orderby`, `pageSize` (50), `createLabel`; salidas `(open)` y `(create)`.
El estado de búsqueda/paginación (`core/sl/sl-list.ts`) y la tabla (`sbo-data-table`) son compartidos con `sbo-value-help`.
### Ventana de formulario (`shared/window`)
Marco de las pantallas `nuevo` y `:docEntry`, con la estructura del mockup:
```html
<sbo-toolbar aria-label="Acciones del documento">
<button class="tb" type="button"><sbo-icon name="new" />Nueva</button>
<button class="tb" type="button"><sbo-icon name="find" />Buscar</button>
<span class="tb-sep"></span>
<button class="tb" type="button" aria-label="Primero"><sbo-icon name="first" /></button>
<!-- prev · next · last · print -->
</sbo-toolbar>
<sbo-window title="Oferta de ventas" [badge]="{ label: 'Nueva', tone: 'info' }" [status]="status()">
<div class="sbo-hdr"><!-- filas de campos --></div>
<sbo-tabs>
<sbo-tab label="Contenido">…</sbo-tab>
<sbo-tab label="Logística">…</sbo-tab>
</sbo-tabs>
<button sboActions class="btn main" type="button">Crear</button>
<button sboActions class="btn" type="button">Cancelar</button>
<sbo-menu-button sboActionsEnd label="Copiar de" [items]="items" (picked)="copyFrom($event)" />
</sbo-window>
```
- `sbo-window`: título, insignia de estado (`tone`: `info` Nueva, `ok` Abierta, `muted` Cerrada, `err` Cancelada, `warn`), cuerpo, zona de acciones (`sboActions` a la izquierda, `sboActionsEnd` a la derecha) y **barra de estado** (`{ kind: 'info' | 'ok' | 'warn' | 'err', text }`, con `role="status"`).
- `sbo-toolbar` + botones `.tb` + `sbo-icon` (iconos SVG en línea: `new find first prev next last print`).
- `sbo-tabs` / `sbo-tab`: los paneles ocultos siguen en el DOM (conservan el estado); `[(selected)]`; flechas ←/→.
- `sbo-menu-button`: lista de acciones que se abre hacia arriba (o `direction="down"`); se cierra con Esc o clic fuera; opciones `disabled`.
- `sbo-badge`: la misma insignia que usan las listas.