(state, handlers, layoutMode)
| 303 | } |
| 304 | |
| 305 | function renderFormPanel(state, handlers, layoutMode) { |
| 306 | const notesRows = layoutMode === "full" ? 4 : 2; |
| 307 | return ui.box( |
| 308 | { |
| 309 | title: "Persistent Form State", |
| 310 | border: "rounded", |
| 311 | px: 1, |
| 312 | py: 0, |
| 313 | style: { fg: palette.ink, bg: palette.panel }, |
| 314 | }, |
| 315 | [ |
| 316 | ui.column({ gap: 1 }, [ |
| 317 | ui.text("Name", { variant: "caption", style: { fg: palette.muted } }), |
| 318 | ui.input({ |
| 319 | id: "name", |
| 320 | value: state.name, |
| 321 | onInput: (value) => handlers.onNameInput(value), |
| 322 | style: { fg: palette.ink, bg: palette.panelAlt }, |
| 323 | }), |
| 324 | ui.text("Notes", { variant: "caption", style: { fg: palette.muted } }), |
| 325 | ui.textarea({ |
| 326 | id: "notes", |
| 327 | value: state.notes, |
| 328 | onInput: (value) => handlers.onNotesInput(value), |
| 329 | rows: notesRows, |
| 330 | style: { fg: palette.ink, bg: palette.panelAlt }, |
| 331 | }), |
| 332 | ]), |
| 333 | ], |
| 334 | ); |
| 335 | } |
| 336 | |
| 337 | function renderRunbookPanel() { |
| 338 | return ui.box( |
no outgoing calls
no test coverage detected