dreamstack/examples/streaming-dashboard.ds
enzotar f29673cbd8 feat: streaming dashboard with imported components + live data
- New streaming-dashboard.ds: first example combining components + streaming
- 4 Card grid with Badge, Button, match, stream receivers
- Receives live data from counter, clock, stats streams
- Button callbacks (Refresh/Reset) work within stream context
- All 8 examples pass regression (47,799 bytes)
2026-02-26 17:51:08 -08:00

62 lines
2.1 KiB
Text

-- DreamStack Streaming Dashboard
-- Combines imported components with live stream data.
-- Receives from 3 upstream apps, renders with Card, Badge, Button.
--
-- Run with:
-- Tab 1: cargo run -p ds-stream
-- Tab 2: dreamstack stream examples/streaming-counter.ds --port 3000
-- Tab 3: dreamstack stream examples/streaming-clock.ds --port 3002
-- Tab 4: dreamstack stream examples/streaming-stats.ds --port 3003
-- Tab 5: dreamstack build examples/streaming-dashboard.ds -o /tmp/dashboard
import { Card } from "../registry/components/card"
import { Badge } from "../registry/components/badge"
import { Button } from "../registry/components/button"
-- Connect to upstream streams
let counter = stream from "ws://localhost:9100/stream/counter"
let clock = stream from "ws://localhost:9100/stream/clock"
let stats = stream from "ws://localhost:9100/stream/stats"
-- Local state
let refreshCount = 0
let theme = "dark"
view main = column [
text "Signal Dashboard" { variant: "title" }
text "Live streaming from 3 DreamStack apps" { variant: "subtitle" }
row [
Card { title: "Counter", subtitle: "real-time count" } [
text "Count: {counter.count}"
text "Doubled: {counter.doubled}"
Badge { label: "LIVE", variant: "success" }
]
Card { title: "Clock", subtitle: "streaming time" } [
text "{clock.hours}:{clock.minutes}:{clock.seconds}"
Badge { label: "TICKING", variant: "info" }
]
]
row [
Card { title: "Statistics", subtitle: "aggregated data" } [
text "Samples: {stats.total}"
text "Average: {stats.average}"
text "Max: {stats.max}"
Badge { label: "TRACKING", variant: "warning" }
]
Card { title: "Controls", subtitle: "dashboard actions" } [
text "Refreshes: {refreshCount}"
row [
Button { label: "Refresh", onClick: refreshCount += 1, variant: "primary" }
Button { label: "Reset", onClick: refreshCount = 0, variant: "ghost" }
]
match theme
"dark" -> Badge { label: "Dark Mode", variant: "info" }
"light" -> Badge { label: "Light Mode", variant: "warning" }
_ -> Badge { label: "System", variant: "info" }
]
]
]