Files

124 lines
4.1 KiB
Go
Raw Permalink Normal View History

//go:build ignore
package main
import (
"fmt"
"strings"
"kit/ext"
)
// Init demonstrates the overlay dialog system. Extensions can show modal
// overlay dialogs that block until the user dismisses them or selects an
// action. Four slash commands illustrate different overlay use cases.
func Init(api ext.API) {
// /overlay-info — simple information dialog (no actions, dismissed with Enter or ESC).
api.RegisterCommand(ext.CommandDef{
Name: "overlay-info",
Description: "Show an info overlay dialog",
Execute: func(args string, ctx ext.Context) (string, error) {
content := "This is a simple informational overlay.\n\n" +
"Overlays are modal dialogs that appear over the TUI.\n" +
"They can display plain text or markdown content.\n\n" +
"Press Enter or ESC to dismiss."
result := ctx.ShowOverlay(ext.OverlayConfig{
Title: "Information",
Content: ext.WidgetContent{Text: content},
Style: ext.OverlayStyle{BorderColor: "#89b4fa"},
})
if result.Cancelled {
return "Info dialog cancelled.", nil
}
return "Info dialog dismissed.", nil
},
})
// /overlay-actions — overlay with action buttons.
api.RegisterCommand(ext.CommandDef{
Name: "overlay-actions",
Description: "Show an overlay with action buttons",
Execute: func(args string, ctx ext.Context) (string, error) {
result := ctx.ShowOverlay(ext.OverlayConfig{
Title: "Deploy to Production?",
Content: ext.WidgetContent{
Text: "You are about to deploy the following changes:\n\n" +
" - Updated API handlers (3 files)\n" +
" - New database migration (v42)\n" +
" - Config change: increased rate limit\n\n" +
"All tests are passing. Last deploy: 2 hours ago.",
},
Style: ext.OverlayStyle{BorderColor: "#f38ba8"},
Width: 65,
Actions: []string{"Deploy", "Cancel", "Show Diff"},
})
if result.Cancelled {
return "Deployment cancelled (ESC).", nil
}
return fmt.Sprintf("Selected action: %q (index %d)", result.Action, result.Index), nil
},
})
// /overlay-markdown — overlay with markdown content.
api.RegisterCommand(ext.CommandDef{
Name: "overlay-md",
Description: "Show an overlay with markdown content",
Execute: func(args string, ctx ext.Context) (string, error) {
md := "## Build Report\n\n" +
"| Component | Status | Duration |\n" +
"|-----------|--------|----------|\n" +
"| Frontend | Pass | 12.3s |\n" +
"| Backend | Pass | 8.7s |\n" +
"| E2E Tests | Pass | 45.1s |\n\n" +
"**Total time:** 66.1s\n\n" +
"All checks passed. Ready to merge."
result := ctx.ShowOverlay(ext.OverlayConfig{
Title: "Build Report",
Content: ext.WidgetContent{Text: md, Markdown: true},
Style: ext.OverlayStyle{BorderColor: "#a6e3a1"},
Width: 70,
Actions: []string{"Merge", "Close"},
})
if result.Cancelled {
return "Build report closed.", nil
}
return fmt.Sprintf("Build report action: %q", result.Action), nil
},
})
// /overlay-scroll — overlay with long scrollable content.
api.RegisterCommand(ext.CommandDef{
Name: "overlay-scroll",
Description: "Show an overlay with scrollable content",
Execute: func(args string, ctx ext.Context) (string, error) {
var lines []string
lines = append(lines, "This overlay has a lot of content to demonstrate scrolling.")
lines = append(lines, "Use j/k or arrow keys to scroll through the content.")
lines = append(lines, "")
for i := 1; i <= 50; i++ {
lines = append(lines, fmt.Sprintf(" Line %02d: The quick brown fox jumps over the lazy dog.", i))
}
lines = append(lines, "")
lines = append(lines, "End of content. Press Enter to dismiss or ESC to cancel.")
result := ctx.ShowOverlay(ext.OverlayConfig{
Title: "Log Output (50 lines)",
Content: ext.WidgetContent{Text: strings.Join(lines, "\n")},
Style: ext.OverlayStyle{BorderColor: "#fab387"},
MaxHeight: 20,
Actions: []string{"OK", "Copy to Clipboard"},
})
if result.Cancelled {
return "Log viewer cancelled.", nil
}
return fmt.Sprintf("Log viewer action: %q", result.Action), nil
},
})
}