{"body":"#!/usr/bin/env raku\nuse Selkie::UI;\nuse Selkie::Style;\nuse Selkie::Theme;\n\nsub dark-theme(--> Selkie::Theme) {\n    Selkie::Theme.new(\n        base              => Selkie::Style.new(fg => 0xEEEEEE, bg => 0x16162E),\n        text              => Selkie::Style.new(fg => 0xEEEEEE),\n        text-dim          => Selkie::Style.new(fg => 0x888899),\n        text-highlight    => Selkie::Style.new(fg => 0xFFFFFF, bold => True),\n        border            => Selkie::Style.new(fg => 0x444466),\n        border-focused    => Selkie::Style.new(fg => 0x7AA2F7, bold => True),\n        input             => Selkie::Style.new(fg => 0xEEEEEE, bg => 0x1A1A2E),\n        input-focused     => Selkie::Style.new(fg => 0xFFFFFF, bg => 0x2A2A3E),\n        input-placeholder => Selkie::Style.new(fg => 0x606080, italic => True),\n        scrollbar-track   => Selkie::Style.new(fg => 0x333344),\n        scrollbar-thumb   => Selkie::Style.new(fg => 0x7AA2F7),\n        divider           => Selkie::Style.new(fg => 0x444466),\n        tab-active        => Selkie::Style.new(fg => 0xFFFFFF, bg => 0x7AA2F7, bold => True),\n        tab-inactive      => Selkie::Style.new(fg => 0x8888A0, bg => 0x16162E),\n    );\n}\n\nsub light-theme(--> Selkie::Theme) {\n    Selkie::Theme.new(\n        base              => Selkie::Style.new(fg => 0x222222, bg => 0xF5F5F0),\n        text              => Selkie::Style.new(fg => 0x222222),\n        text-dim          => Selkie::Style.new(fg => 0x666666),\n        text-highlight    => Selkie::Style.new(fg => 0x000000, bold => True),\n        border            => Selkie::Style.new(fg => 0xCCCCCC),\n        border-focused    => Selkie::Style.new(fg => 0x3366CC, bold => True),\n        input             => Selkie::Style.new(fg => 0x222222, bg => 0xFFFFFF),\n        input-focused     => Selkie::Style.new(fg => 0x000000, bg => 0xEEEEFF),\n        input-placeholder => Selkie::Style.new(fg => 0x999999, italic => True),\n        scrollbar-track   => Selkie::Style.new(fg => 0xDDDDDD),\n        scrollbar-thumb   => Selkie::Style.new(fg => 0x3366CC),\n        divider           => Selkie::Style.new(fg => 0xCCCCCC),\n        tab-active        => Selkie::Style.new(fg => 0xFFFFFF, bg => 0x3366CC, bold => True),\n        tab-inactive      => Selkie::Style.new(fg => 0x666688, bg => 0xF5F5F0),\n    );\n}\n\nApp {\n\tmy $messages := new-state [\n\t\t{\n\t\t\tspeaker => 'bot',\n\t\t\ttext => 'Hello! Type something and I will echo it back, transformed.'\n\t\t},\n\t];\n\tmy $dark := new-state True;\n\t.theme: { $dark ?? dark-theme() !! light-theme() }\n\n\tVBox {\n\t\tBorder :title<Chat>, {\n\t\t\tCardList.set-items: {\n\t\t\t\t$messages.map: -> %message {\n\t\t\t\t\tmy $speaker = (%message<speaker> // 'unknown').Str;\n\t\t\t\t\tmy $text = (%message<text> // '').Str;\n\t\t\t\t\tmy $is-bot = $speaker eq 'bot';\n\t\t\t\t\tmy $name-style = Selkie::Style.new(\n\t\t\t\t\t\tfg => $is-bot ?? 0x9ECE6A !! 0x7AA2F7,\n\t\t\t\t\t\t:bold,\n\t\t\t\t\t);\n\t\t\t\t\tmy $body-style = Selkie::Style.new(fg => 0xEEEEEE);\n\t\t\t\t\tmy $rich = RichText.content([\n\t\t\t\t\t\t{ text => \"$speaker: \", style => $name-style },\n\t\t\t\t\t\t{ text => $text,        style => $body-style },\n\t\t\t\t\t]);\n\t\t\t\t\tmy $card = Border;\n\t\t\t\t\t$card.content($rich);\n\t\t\t\t\t{\n\t\t\t\t\t\twidget => $rich,\n\t\t\t\t\t\troot => $card,\n\t\t\t\t\t\tborder => $card,\n\t\t\t\t\t\theight => 3,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tBorder :title<Compose>, {\n\t\t\tMultiLineInput.placeholder('Type a message — Ctrl+Enter to send')\n\t\t\t\t.on-submit: -> $input, $text {\n\t\t\t\t\tif $text.trim {\n\t\t\t\t\t\tmy $trim = $text.trim;\n\t\t\t\t\t\tmy $reply = $trim.flip;\n\t\t\t\t\t\t$messages = [\n\t\t\t\t\t\t\t|$messages,\n\t\t\t\t\t\t\t{ speaker => 'you', text => $trim },\n\t\t\t\t\t\t\t{ speaker => 'bot', text => \"Reversed: $reply\" },\n\t\t\t\t\t\t];\n\t\t\t\t\t\t$input.clear;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t}\n\tOnKey 'ctrl+l', {\n\t\t$messages = [];\n\t\tToast 'Cleared';\n\t};\n\tOnKey 'ctrl+t', {\n\t\t$dark = !$dark;\n\t\tToast 'Theme toggled';\n\t};\n\tOnKey 'ctrl+q', { Quit }\n}\n","name":"","extension":"raku","url":"https://www.irccloud.com/pastebin/5ZwnKEGb","modified":1777386016,"id":"5ZwnKEGb","size":3775,"lines":106,"own_paste":false,"theme":"","date":1777385925}