fix(hooks): refactor dimension hooks (#106)

This commit is contained in:
Matt Simpson
2025-08-30 08:14:47 +01:00
committed by GitHub
parent 86473db0aa
commit 67670eee6e
5 changed files with 35 additions and 12 deletions
+4
View File
@@ -21,11 +21,13 @@ This monorepo contains the following packages:
## Install
### TypeScript/JavaScript
```bash
bun install @opentui/core
```
### Go
```bash
go get github.com/sst/opentui/packages/go
```
@@ -33,6 +35,7 @@ go get github.com/sst/opentui/packages/go
## Running Examples (from the repo root)
### TypeScript Examples
```bash
bun install
cd packages/core
@@ -40,6 +43,7 @@ bun run src/examples/index.ts
```
### Go Examples
```bash
# Basic example
cd packages/go/examples/basic
+14 -5
View File
@@ -5,7 +5,7 @@ Go bindings for [OpenTUI](https://github.com/sst/opentui), a high-performance te
## Features
- **High Performance**: Direct bindings to optimized Zig code
- **Memory Safe**: Automatic resource management with Go finalizers
- **Memory Safe**: Automatic resource management with Go finalizers
- **Cross-Platform**: Support for Linux, macOS, and Windows
- **Full Feature Set**: Complete API coverage including mouse support
- **Idiomatic Go**: Proper error handling and Go conventions
@@ -29,7 +29,7 @@ package main
import (
"time"
"github.com/sst/opentui/packages/go"
)
@@ -37,12 +37,12 @@ func main() {
// Create renderer
renderer := opentui.NewRenderer(80, 24)
defer renderer.Close()
// Get buffer and draw
buffer, _ := renderer.GetNextBuffer()
buffer.Clear(opentui.NewRGB(0.1, 0.1, 0.3))
buffer.DrawText("Hello, OpenTUI!", 10, 5, opentui.White, nil, 0)
// Render to terminal
renderer.Render(true)
time.Sleep(2 * time.Second)
@@ -54,6 +54,7 @@ func main() {
### Core Types
#### Renderer
The main rendering engine that manages terminal output.
```go
@@ -74,6 +75,7 @@ renderer.Resize(newWidth, newHeight)
```
#### Buffer
A 2D array of terminal cells for efficient rendering.
```go
@@ -96,6 +98,7 @@ buffer.DrawBox(5, 5, 30, 10, options, opentui.White, opentui.Gray)
```
#### TextBuffer
Efficient handling of styled text with line tracking.
```go
@@ -118,6 +121,7 @@ lines, err := textBuffer.GetLineInfo()
### Colors and Styling
#### RGBA Colors
```go
// Predefined colors
opentui.Black, opentui.White, opentui.Red, opentui.Green, opentui.Blue
@@ -129,6 +133,7 @@ rgb := opentui.NewRGB(0.2, 0.8, 0.4) // Green (alpha = 1.0)
```
#### Text Attributes
```go
opentui.AttrBold // Bold text
opentui.AttrItalic // Italic text
@@ -160,6 +165,7 @@ opentui.SetCursorColor(opentui.Green)
### Advanced Features
#### Direct Buffer Access
For performance-critical operations, you can access buffer arrays directly:
```go
@@ -179,6 +185,7 @@ directAccess.SetCell(x, y, opentui.Cell{
```
#### Hit Testing
For mouse interaction support:
```go
@@ -195,10 +202,12 @@ if hitID == 42 {
## Examples
See the `examples/` directory for complete working examples:
- `basic/` - Simple "Hello World" example
- `console/` - Interactive console demo with mouse support
To run examples:
```bash
cd examples/basic && go run .
cd examples/console && go run .
@@ -227,4 +236,4 @@ go test
## License
MIT License - see main repository for details.
MIT License - see main repository for details.
+14 -4
View File
@@ -15,11 +15,13 @@ This demo recreates the OpenTUI console logging demo from TypeScript, showcasing
## Controls
### Keyboard Controls
- **1-5**: Trigger buttons (LOG, INFO, WARN, ERROR, DEBUG)
- **q/Q**: Quit demo
- **ESC**: Exit
### Mouse Controls (if supported)
- **Click**: Click on buttons to trigger them
- **Hover**: Buttons change color on hover
@@ -36,6 +38,7 @@ go build .
## Implementation Highlights
### ConsoleButton Struct
```go
type ConsoleButton struct {
ID string
@@ -43,13 +46,13 @@ type ConsoleButton struct {
Width, Height uint32
Label string
LogType string
// Colors for different states
OriginalBg opentui.RGBA
HoverBg opentui.RGBA
HoverBg opentui.RGBA
PressBg opentui.RGBA
BorderColor opentui.RGBA
// State tracking
IsHovered bool
IsPressed bool
@@ -59,12 +62,15 @@ type ConsoleButton struct {
```
### Visual Effects
- **Sparkle Animation**: ✦ symbols appear briefly when buttons are clicked
- **Color States**: Buttons change color based on hover/press state
- **Alpha Blending**: Smooth color transitions and transparency effects
### Console Logging
Each button type produces different log output:
- **LOG**: Regular console.log output
- **INFO**: Informational messages
- **WARN**: Warning messages with additional context
@@ -72,7 +78,9 @@ Each button type produces different log output:
- **DEBUG**: Debug information with variables
### Input Handling
The demo supports multiple input modes:
1. **Raw Terminal Input**: Direct key reading for responsive controls
2. **Simple Line Input**: Fallback mode for terminals without raw input support
3. **Mouse Events**: ANSI mouse tracking (where supported)
@@ -80,11 +88,13 @@ The demo supports multiple input modes:
## Terminal Compatibility
Works best in terminals that support:
- ANSI escape sequences
- Mouse tracking (optional)
- 24-bit color (optional, fallback to 8-bit)
Tested terminals:
- ✅ macOS Terminal.app
- ✅ iTerm2
- ✅ VSCode Terminal
@@ -101,4 +111,4 @@ The demo showcases several OpenTUI Go wrapper features:
5. **Text Attributes**: Bold, italic, and other text styling
6. **Event Loop**: Handling input and rendering in a game-style loop
This serves as both a functional demo and a reference implementation for building interactive terminal applications with the OpenTUI Go wrapper.
This serves as both a functional demo and a reference implementation for building interactive terminal applications with the OpenTUI Go wrapper.
@@ -9,8 +9,8 @@ export const useTerminalDimensions = () => {
width: number
height: number
}>({
width: renderer.terminalWidth,
height: renderer.terminalHeight,
width: renderer.width,
height: renderer.height,
})
const cb = (width: number, height: number) => {
+1 -1
View File
@@ -40,7 +40,7 @@ export const useTerminalDimensions = () => {
const [terminalDimensions, setTerminalDimensions] = createSignal<{
width: number
height: number
}>({ width: renderer.terminalWidth, height: renderer.terminalHeight })
}>({ width: renderer.width, height: renderer.height })
const callback = (width: number, height: number) => {
setTerminalDimensions({ width, height })