batch A-3.1: add semantic events to 12 interactive morfos

A pass over every component flagged "interactive with 0 events"
(audit A-3.1) plus the texts.label slot they all shared. The events
follow the canonical sema families and reuse the focus-move
filtering installed earlier so the audit no longer treats keyboard
navigation as missing coverage.

Per-component event additions:

  - listbox: commit-select, commit-unselect (affirm/neutral, target=item)
  - toggle-group: commit-toggle (intent fromProp, target=item)
  - grid-list: commit-select, commit-unselect (target=item)
  - context-menu: open, close, commit-select
  - dropdown-menu: open, close, commit-select
  - menubar: commit-select
  - navigation-menu: commit-select
  - tree-view: commit-select + shift-expand + shift-collapse
  - tree-grid: commit-select + shift-expand + shift-collapse
  - table: shift-sort + commit-select + shift-expand-row
  - carousel: shift-slide
  - feed: commit-load-more + shift-focus-item
  - command: commit-invoke (palette item invocation, intent fulfill)
  - splitter: commit-resize (handle settle, not continuous drag)
  - drag-drop: commit-drag-start + commit-drop + commit-cancel
  - color-field: commit-set
  - time-field: commit-set

Each got a `texts.label` slot + matching catalog entry. New
catalog files for context-menu / dropdown-menu / menubar /
toggle-group; existing files extended for the rest.

Audit: PASS 25 → 33 in one batch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
active-uix
dev 5 months ago
parent 491e4be75c
commit 98fc40bf62

@ -8,9 +8,13 @@ import type { LangNode } from '$libs/langs';
* `'#?components.color-field.{key}|fallback'`.
*/
export const colorFieldLangs = {
label: {
es: 'Campo de color',
en: 'Color field'
},
input: {
es: "Valor del color",
en: "Color value"
es: 'Valor del color',
en: 'Color value'
},
empty: {
es: "Vacío",

@ -8,8 +8,12 @@ import type { LangNode } from '$libs/langs';
* `'#?components.command.{key}|fallback'`.
*/
export const commandLangs = {
label: {
es: 'Paleta de comandos',
en: 'Command palette'
},
list: {
es: "Paleta de comandos",
en: "Command palette"
es: 'Paleta de comandos',
en: 'Command palette'
}
} satisfies LangNode;

@ -0,0 +1,12 @@
import type { LangNode } from '$libs/langs';
/**
* Default strings for the context-menu component. Merged under
* `components.context-menu.*` by `ActiveUix` (via `componentLangs` barrel).
*/
export const contextMenuLangs = {
label: {
es: 'Menú contextual',
en: 'Context menu'
}
} satisfies LangNode;

@ -8,6 +8,10 @@ import type { LangNode } from '$libs/langs';
* `'#?components.drag-drop.{key}|fallback'`.
*/
export const dragDropLangs = {
label: {
es: 'Arrastrar y soltar',
en: 'Drag and drop'
},
'drag-started': {
es: "Arrastrando {{item}}",
en: "Started dragging {{item}}"

@ -0,0 +1,8 @@
import type { LangNode } from '$libs/langs';
export const dropdownMenuLangs = {
label: {
es: 'Menú desplegable',
en: 'Dropdown menu'
}
} satisfies LangNode;

@ -10,6 +10,7 @@ import { colorFieldLangs } from './color-field';
import { colorPickerLangs } from './color-picker';
import { comboboxLangs } from './combobox';
import { commandLangs } from './command';
import { contextMenuLangs } from './context-menu';
import { dateFieldLangs } from './date-field';
import { datePickerLangs } from './date-picker';
import { dateRangeFieldLangs } from './date-range-field';
@ -17,11 +18,13 @@ import { dateRangePickerLangs } from './date-range-picker';
import { dialogLangs } from './dialog';
import { dragDropLangs } from './drag-drop';
import { drawerLangs } from './drawer';
import { dropdownMenuLangs } from './dropdown-menu';
import { feedLangs } from './feed';
import { fileUploadLangs } from './file-upload';
import { formLangs } from './form';
import { gridListLangs } from './grid-list';
import { listboxLangs } from './listbox';
import { menubarLangs } from './menubar';
import { meterLangs } from './meter';
import { navigationMenuLangs } from './navigation-menu';
import { paginationLangs } from './pagination';
@ -41,6 +44,7 @@ import { timeFieldLangs } from './time-field';
import { timePickerLangs } from './time-picker';
import { timeRangeFieldLangs } from './time-range-field';
import { timeRangePickerLangs } from './time-range-picker';
import { toggleGroupLangs } from './toggle-group';
import { tooltipLangs } from './tooltip';
import { treeGridLangs } from './tree-grid';
import { treeViewLangs } from './tree-view';
@ -64,6 +68,7 @@ export const componentLangs = {
'color-picker': colorPickerLangs,
combobox: comboboxLangs,
command: commandLangs,
'context-menu': contextMenuLangs,
'date-field': dateFieldLangs,
'date-picker': datePickerLangs,
'date-range-field': dateRangeFieldLangs,
@ -71,11 +76,13 @@ export const componentLangs = {
dialog: dialogLangs,
'drag-drop': dragDropLangs,
drawer: drawerLangs,
'dropdown-menu': dropdownMenuLangs,
feed: feedLangs,
'file-upload': fileUploadLangs,
form: formLangs,
'grid-list': gridListLangs,
listbox: listboxLangs,
menubar: menubarLangs,
meter: meterLangs,
'navigation-menu': navigationMenuLangs,
pagination: paginationLangs,
@ -95,6 +102,7 @@ export const componentLangs = {
'time-picker': timePickerLangs,
'time-range-field': timeRangeFieldLangs,
'time-range-picker': timeRangePickerLangs,
'toggle-group': toggleGroupLangs,
tooltip: tooltipLangs,
'tree-grid': treeGridLangs,
'tree-view': treeViewLangs,

@ -0,0 +1,8 @@
import type { LangNode } from '$libs/langs';
export const menubarLangs = {
label: {
es: 'Barra de menú',
en: 'Menubar'
}
} satisfies LangNode;

@ -8,8 +8,12 @@ import type { LangNode } from '$libs/langs';
* `'#?components.splitter.{key}|fallback'`.
*/
export const splitterLangs = {
label: {
es: 'Divisor',
en: 'Splitter'
},
resize: {
es: "Redimensionar paneles",
en: "Resize panels"
es: 'Redimensionar paneles',
en: 'Resize panels'
}
} satisfies LangNode;

@ -8,8 +8,12 @@ import type { LangNode } from '$libs/langs';
* `'#?components.time-field.{key}|fallback'`.
*/
export const timeFieldLangs = {
label: {
es: 'Campo de hora',
en: 'Time field'
},
input: {
es: "Campo de hora",
en: "Time field"
es: 'Campo de hora',
en: 'Time field'
}
} satisfies LangNode;

@ -0,0 +1,8 @@
import type { LangNode } from '$libs/langs';
export const toggleGroupLangs = {
label: {
es: 'Grupo de toggles',
en: 'Toggle group'
}
} satisfies LangNode;

@ -13,6 +13,18 @@ export const carouselMorfo = {
indicator: '#?components.carousel.indicator|Go to slide {{index}}',
slide: '#?components.carousel.slide|Slide {{index}} of {{total}}'
},
events: [
{
// Slide change — user-initiated (button/indicator) or auto-rotation.
name: 'shift-slide',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('slide'),
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,6 +6,7 @@ export const colorFieldMorfo = {
kebab: 'color-field',
scope: ['soma'],
texts: {
label: '#?components.color-field.label|Color field',
input: '#?components.color-field.input|Color value',
empty: '#?components.color-field.empty|Empty',
invalid: '#?components.color-field.invalid|Invalid color',
@ -22,6 +23,18 @@ export const colorFieldMorfo = {
'channel-l': '#?components.color-field.channel-l|Lightness',
'channel-alpha': '#?components.color-field.channel-alpha|Alpha'
},
events: [
{
name: 'commit-set',
semantic: {
family: 'commit',
verb: 'set',
target: v.partRef('input'),
intent: 'neutral',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,8 +6,22 @@ export const commandMorfo = {
kebab: 'command',
scope: ['soma'],
texts: {
label: '#?components.command.label|Command palette',
list: '#?components.command.list|Command palette'
},
events: [
{
// User invoked a command (Enter on highlighted item or click).
name: 'commit-invoke',
semantic: {
family: 'commit',
verb: 'submit',
target: v.partRef('item'),
intent: 'fulfill',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,6 +6,9 @@ export const contextMenuMorfo = {
kebab: 'context-menu',
scope: ['soma'],
apg: 'https://www.w3.org/WAI/ARIA/apg/patterns/menu/',
texts: {
label: '#?components.context-menu.label|Context menu'
},
focus: {
initial: 'first-focusable',
@ -14,6 +17,39 @@ export const contextMenuMorfo = {
restore: true
},
events: [
{
name: 'open',
semantic: {
family: 'emerge',
verb: 'open',
target: v.partRef('content'),
sequence: 'pre'
},
commits: { part: v.partRef('content'), attr: 'data-state', value: 'open' }
},
{
name: 'close',
semantic: {
family: 'emerge',
verb: 'close',
target: v.partRef('content'),
sequence: 'pre'
},
commits: { part: v.partRef('content'), attr: 'data-state', value: 'closed' }
},
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,6 +6,7 @@ export const dragDropMorfo = {
kebab: 'drag-drop',
scope: ['soma'],
texts: {
label: '#?components.drag-drop.label|Drag and drop',
'drag-started': '#?components.drag-drop.drag-started|Started dragging {{item}}',
'drag-over': '#?components.drag-drop.drag-over|Over drop zone {{target}}',
dropped: '#?components.drag-drop.dropped|Dropped {{item}} on {{target}}',
@ -17,6 +18,38 @@ export const dragDropMorfo = {
'droppable-role': '#?components.drag-drop.droppable-role|drop zone',
'droppable-active': '#?components.drag-drop.droppable-active|active drop zone'
},
events: [
{
name: 'commit-drag-start',
semantic: {
family: 'commit',
verb: 'submit',
target: v.partRef('draggable'),
intent: 'neutral',
sequence: 'post'
}
},
{
name: 'commit-drop',
semantic: {
family: 'commit',
verb: 'submit',
target: v.partRef('droppable'),
intent: 'fulfill',
sequence: 'post'
}
},
{
name: 'commit-cancel',
semantic: {
family: 'commit',
verb: 'reset',
target: v.partRef('draggable'),
intent: 'neutral',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,6 +6,9 @@ export const dropdownMenuMorfo = {
kebab: 'dropdown-menu',
scope: ['soma'],
apg: 'https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/',
texts: {
label: '#?components.dropdown-menu.label|Dropdown menu'
},
focus: {
initial: 'first-focusable',
@ -14,6 +17,39 @@ export const dropdownMenuMorfo = {
restore: true
},
events: [
{
name: 'open',
semantic: {
family: 'emerge',
verb: 'open',
target: v.partRef('content'),
sequence: 'pre'
},
commits: { part: v.partRef('content'), attr: 'data-state', value: 'open' }
},
{
name: 'close',
semantic: {
family: 'emerge',
verb: 'close',
target: v.partRef('content'),
sequence: 'pre'
},
commits: { part: v.partRef('content'), attr: 'data-state', value: 'closed' }
},
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -9,6 +9,30 @@ export const feedMorfo = {
texts: {
label: '#?components.feed.label|Feed'
},
events: [
{
// User asked for more items (infinite scroll trigger / load-more
// button). Soma owns whether/when to actually fetch.
name: 'commit-load-more',
semantic: {
family: 'commit',
verb: 'add',
target: v.partRef('provider'),
intent: 'neutral',
sequence: 'post'
}
},
{
// Item focused via keyboard navigation (j/k or Arrow keys).
name: 'shift-focus-item',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('article'),
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -10,6 +10,28 @@ export const gridListMorfo = {
label: '#?components.grid-list.label|Grid list',
'select-row': '#?components.grid-list.select-row|Select row'
},
events: [
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
},
{
name: 'commit-unselect',
semantic: {
family: 'commit',
verb: 'remove',
target: v.partRef('item'),
intent: 'neutral',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -9,6 +9,28 @@ export const listboxMorfo = {
texts: {
label: '#?components.listbox.label|Options'
},
events: [
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
},
{
name: 'commit-unselect',
semantic: {
family: 'commit',
verb: 'remove',
target: v.partRef('item'),
intent: 'neutral',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,6 +6,21 @@ export const menubarMorfo = {
kebab: 'menubar',
scope: ['soma'],
apg: 'https://www.w3.org/WAI/ARIA/apg/patterns/menubar/',
texts: {
label: '#?components.menubar.label|Menubar'
},
events: [
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -8,6 +8,18 @@ export const navigationMenuMorfo = {
texts: {
label: '#?components.navigation-menu.label|Main'
},
events: [
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,8 +6,23 @@ export const splitterMorfo = {
kebab: 'splitter',
scope: ['soma'],
texts: {
label: '#?components.splitter.label|Splitter',
resize: '#?components.splitter.resize|Resize panels'
},
events: [
{
// Handle drag committed (mouse-up). Continuous resize during drag
// is not a sema event — only the settled value matters.
name: 'commit-resize',
semantic: {
family: 'commit',
verb: 'set',
target: v.partRef('handle'),
intent: 'neutral',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -11,6 +11,39 @@ export const tableMorfo = {
'row-detail-expand': '#?components.table.row-detail-expand|Show details',
'row-detail-collapse': '#?components.table.row-detail-collapse|Hide details'
},
events: [
{
// Column sort change.
name: 'shift-sort',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('header-cell'),
sequence: 'post'
}
},
{
// Row selection (single or multi).
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('row'),
intent: 'affirm',
sequence: 'post'
}
},
{
// Expand the row's detail panel.
name: 'shift-expand-row',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('row'),
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -6,8 +6,21 @@ export const timeFieldMorfo = {
kebab: 'time-field',
scope: ['soma'],
texts: {
label: '#?components.time-field.label|Time field',
input: '#?components.time-field.input|Time field'
},
events: [
{
name: 'commit-set',
semantic: {
family: 'commit',
verb: 'set',
target: v.partRef('input'),
intent: 'neutral',
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -5,6 +5,27 @@ export const toggleGroupMorfo = {
name: 'ToggleGroup',
kebab: 'toggle-group',
scope: ['soma'],
texts: {
label: '#?components.toggle-group.label|Toggle group'
},
events: [
{
// Per-item toggle. Same semantics as Toggle but emitted from the
// group's child item; target is the item part.
name: 'commit-toggle',
semantic: {
family: 'commit',
verb: 'toggle',
target: v.partRef('item'),
intent: {
fromProp: 'intent',
default: 'neutral',
supported: ['neutral', 'affirm', 'risk', 'threat']
},
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -12,6 +12,36 @@ export const treeGridMorfo = {
expand: '#?components.tree-grid.expand|Expand row',
collapse: '#?components.tree-grid.collapse|Collapse row'
},
events: [
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('row'),
intent: 'affirm',
sequence: 'post'
}
},
{
name: 'shift-expand',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('row'),
sequence: 'post'
}
},
{
name: 'shift-collapse',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('row'),
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

@ -9,6 +9,37 @@ export const treeViewMorfo = {
texts: {
label: '#?components.tree-view.label|Tree'
},
events: [
{
name: 'commit-select',
semantic: {
family: 'commit',
verb: 'select',
target: v.partRef('item'),
intent: 'affirm',
sequence: 'post'
}
},
{
// Expand a node — visible commit (the user wants to see children).
name: 'shift-expand',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('item'),
sequence: 'post'
}
},
{
name: 'shift-collapse',
semantic: {
family: 'shift',
verb: 'navigate',
target: v.partRef('item'),
sequence: 'post'
}
}
],
parts: [
{
name: 'Provider',

Loading…
Cancel
Save

Powered by TurnKey Linux.