dreamstack/examples/mission-control.ds

213 lines
7.5 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ═══════════════════════════════════════════════════════════
-- ⚡ DreamStack Playground
-- ═══════════════════════════════════════════════════════════
-- One page. Everything visible. Click and watch data flow.
--
-- dreamstack build examples/mission-control.ds -o /tmp/mission-control
import { Card } from "../registry/components/card"
import { Badge } from "../registry/components/badge"
-- ════════════════════════════════
-- SIGNALS — the core of DreamStack
-- ════════════════════════════════
let score = 0
let player = "Player 1"
let status = "idle"
let hp = 100
let xp = 0
let level = 1
let inventory = ["Sword", "Shield", "Potion"]
let log = ["Game started"]
-- Derived: auto-computed from source signals
let damage = score * 3
let shield = hp > 50
let rank = level * 10 + xp
-- Spring: physics-animated value
let energy = spring(100)
view main = column [
text "⚡ DreamStack Playground" { variant: "title" }
-- ════════════════════════════════
-- SOURCE: You control signals here
-- ════════════════════════════════
row [
-- SIGNAL CONTROL PANEL
Card { title: "🎮 Source Signals", subtitle: "change these → everything reacts" } [
text "score" { variant: "subtitle" }
text "{score}" { variant: "title" }
row [
button "+1" { click: score += 1, variant: "primary" }
button "+10" { click: score += 10, variant: "primary" }
button "0" { click: score = 0, variant: "ghost" }
]
text "hp" { variant: "subtitle" }
text "{hp}" { variant: "title" }
row [
button "Hit -20" { click: hp -= 20, variant: "destructive" }
button "Heal +30" { click: hp += 30, variant: "primary" }
button "Full" { click: hp = 100, variant: "ghost" }
]
text "status" { variant: "subtitle" }
row [
button "idle" { click: status = "idle", variant: "ghost" }
button "fighting" { click: status = "fighting", variant: "primary" }
button "dead" { click: status = "dead", variant: "destructive" }
]
text "level / xp" { variant: "subtitle" }
row [
button "XP +5" { click: xp += 5, variant: "primary" }
button "Level Up" { click: level += 1, variant: "primary" }
]
]
-- DERIVED SIGNALS — auto-updated
Card { title: "⚙️ Derived Signals", subtitle: "auto-computed, zero code" } [
text "damage = score × 3" { variant: "subtitle" }
text "{damage}" { variant: "title" }
text "shield = hp > 50" { variant: "subtitle" }
when shield ->
Badge { label: "SHIELD UP ✓", variant: "success" }
else ->
Badge { label: "SHIELD DOWN ✗", variant: "error" }
text "rank = level × 10 + xp" { variant: "subtitle" }
text "{rank}" { variant: "title" }
text "energy (spring)" { variant: "subtitle" }
text "{energy}" { variant: "title" }
row [
button "Drain" { click: energy = 10, variant: "destructive" }
button "Charge" { click: energy = 100, variant: "primary" }
]
]
]
-- ════════════════════════════════
-- REACTIVE UI — responds to signals
-- ════════════════════════════════
row [
-- MATCH: status drives which badge shows
Card { title: "📊 Status Display", subtitle: "match status" } [
match status
"idle" -> Badge { label: "💤 IDLE", variant: "info" }
"fighting" -> Badge { label: "⚔️ FIGHTING", variant: "warning" }
"dead" -> Badge { label: "💀 DEAD", variant: "error" }
_ -> Badge { label: "???", variant: "info" }
-- WHEN/ELSE: conditional rendering
when hp > 80 ->
text "💚 Healthy"
when hp > 30 ->
text "💛 Wounded"
else ->
text "❤️ Critical!"
when score > 20 ->
Badge { label: "🔥 ON FIRE", variant: "warning" }
]
-- EACH: dynamic list
Card { title: "🎒 Inventory", subtitle: "each + array methods" } [
each item in inventory ->
row [
Badge { label: item, variant: "info" }
button "Drop" { click: inventory.remove(_idx), variant: "ghost" }
]
row [
button "+Bow" { click: inventory.push("Bow"), variant: "primary" }
button "+Ring" { click: inventory.push("Ring"), variant: "primary" }
button "Sort" { click: inventory.sort(), variant: "ghost" }
button "Clear" { click: inventory.clear(), variant: "destructive" }
]
]
-- INPUT BINDING + LOG
Card { title: "📝 Event Log", subtitle: "input bind + push" } [
input { bind: player, placeholder: "Player name..." }
text "Playing as: {player}" { variant: "title" }
button "Log Score" { click: log.push(player), variant: "primary" }
each entry in log ->
text "→ {entry}"
]
]
-- ════════════════════════════════
-- EMBED: what a page needs to receive this
-- ════════════════════════════════
Card { title: "📡 Receiver — Live Signal Values", subtitle: "these signals stream to any receiver" } [
row [
column [
text "score = {score}"
text "damage = {damage}"
text "hp = {hp}"
]
column [
text "shield = {shield}"
text "level = {level}"
text "rank = {rank}"
]
column [
text "status = {status}"
text "player = {player}"
text "xp = {xp}"
]
]
]
Card { title: "🔌 Embed Option 1 — iframe", subtitle: "one line, any website" } [
text "Paste into any HTML page:" { variant: "subtitle" }
text ""
text "[iframe src=your-relay/view/game /]"
text ""
text "The compiled .ds app runs inside the iframe."
text "Self-contained, no dependencies."
Badge { label: "ZERO CONFIG", variant: "success" }
]
Card { title: "🔌 Embed Option 2 — JS API", subtitle: "vanilla JavaScript, full control" } [
text "Add to any web page:" { variant: "subtitle" }
text ""
text "[script src=dreamstack-runtime.js]"
text ""
text " const game = DS._connectStream(RELAY_URL)"
text ""
text " game.on(score, (v) => scoreEl.textContent = v)"
text ""
text " game.on(hp, (v) => healthBar.style.width = v)"
text ""
text "[/script]"
text ""
Badge { label: "3 LINES OF JS", variant: "success" }
text "Works with React, Vue, Svelte, vanilla — anything."
]
Card { title: "🔌 Embed Option 3 — DreamStack .ds", subtitle: "full reactive receiver" } [
text "Write a .ds file — compile to self-contained HTML:" { variant: "subtitle" }
text ""
text "let game = stream from RELAY_URL"
text ""
text "view main = column ["
text " text Score: (game.score)"
text " when game.hp is low ->"
text " text DANGER!"
text "]"
text ""
Badge { label: "FULL REACTIVITY", variant: "info" }
text "Remote signals become local reactive proxies."
text "Match, when/else, each — everything works on remote data."
]
]