necessary/example-app
PublicFull-stack web application with i18n, CI, and plugin support. Supports locale switching, REST API, and extensible middleware.
CodeIssues7PRs3CITranslations14Chat3Settings
!necessary/example-appFull-stack web application with i18n, CI, and plugin support · 3 open PRs · CI passing
Pins SearchIRC client ↗
alice: v3.4.0 release freeze starts Monday. All feature PRs should be merged by Friday EOD.
Yesterday
gumtree · 🏷️ v3.3.2 released — 3 contributors, 12 commits · Hotfix for Japanese locale
A
alice16:22
good, the es locale fix is shipped. carol, can you ask the testers to try v3.3.2?
C
carol16:45
done, sent it to fay and grace. they'll report back tomorrow
👍 1
Today
gumtree · 🔀 brendan pushed to
fix/locale-fallback — 4 filesgumtree · 🔃 PR #131 opened: Fix locale fallback for multibyte sequences — see !necessary/example-app/pr/131
B
brendan12:16
heads up — PR #131 fixes the locale bug carol reported. discussion in !necessary/example-app/pr/131, also cross-posted to #design
B
bob12:20
this also explains the encoding misses. UTF-8
ü in the data vs Latin-1 u + combining umlaut from conversion💡 2
cicada · ✓ !necessary/example-app/ci/313 passed — 11/11 green (5m 22s)
new messages
C
carol13:44
just tested the ja locale — 'tōkyō' predicts correctly now! posted the good news to #beta-testers too
🎉 3
A
alice14:01
great work. @brendan should we ship this as v3.3.3 hotfix? it affects all 14 supported locales
B
brendan14:08
alice should we ship this as v3.3.3 hotfix…
v3.3.3 hotfix, yeah. it's a regression from the encoding change in v3.3.0 and it affects every i18n user
B
bob14:12
+1 for hotfix. also confirmed it fixes encoding for fr — our largest user base
alice is typing…
Online — 4
B
A
B
C
Bots — 2
G
C
Offline — 8
D
E
+
necessary
Channels+ New
#general
#ci@1
#design
#infra
#beta-testers
Repositories
example-app4
pr
!1313open
!130open
!129open
!128merged
!126closed
ci
!313✓ pass
!312◉ run
!311✓
locale
!fr
!de
!ja
static-lib-build
ci
!89✕ fail
!88✓
api-server
example-spell
lang-core
lang-data
Direct Messages
alice
bob
carol
dave
🌿 EucalyptIRCd · IRCv3 · FoundationDB
Connected!necessary/example-app · EucalyptIRCd
Page Source
import { d as define , a , u , N as Navbar } from "../server-entry.mjs" ;
import { C as CodeBlock } from "./CodeBlock-De-4QTIX.mjs" ;
import { S as StatusBar } from "./StatusBar-BQuHucTn.mjs" ;
import { R as RepoHeader } from "./RepoHeader-CUa-_UBh.mjs" ;
import { R as RepoTabs } from "./RepoTabs-C_wVCins.mjs" ;
import { S as SearchInput } from "./SearchInput-D3rbpEPp.mjs" ;
import { A as Avatar } from "./Avatar-Potiq9_c.mjs" ;
import { I as Icon } from "./Icon-CgSYtcJ1.mjs" ;
import { C as ChannelTree } from "./ChannelTree-CG09VU2y.mjs" ;
import { T as TreeNode } from "./TreeNode-68PoIL0m.mjs" ;
import { T as TreeSection } from "./TreeSection-CUxuIlt3.mjs" ;
import { T as TreeBadge } from "./TreeBadge-C3FbDBSf.mjs" ;
import { T as TreeFooter } from "./TreeFooter-BdVyBaRz.mjs" ;
import { C as ChannelRow } from "./ChannelRow-DZlZHOVY.mjs" ;
import { D as DMRow } from "./DMRow-pahd6iwb.mjs" ;
import { a as ChatHeaderAction , C as ChatHeader } from "./ChatHeader-BO8tqNOv.mjs" ;
import { C as ChatPinnedBar } from "./ChatPinnedBar-CYifgiBg.mjs" ;
import { C as ChatMessage } from "./ChatMessage-BQgJw0Y9.mjs" ;
import { B as BotEvent } from "./BotEvent-BhzovTfp.mjs" ;
import { R as Reaction } from "./Reaction-BKd3RZDy.mjs" ;
import { R as ReplyQuote } from "./ReplyQuote-FksNwqcQ.mjs" ;
import { D as DateSeparator } from "./DateSeparator-BzbknIEm.mjs" ;
import { R as ReadMarker } from "./ReadMarker-DZpLMP5v.mjs" ;
import { C as ChannelRef } from "./ChannelRef-BKn59NVA.mjs" ;
import { C as ChatInput } from "./ChatInput-Cv3B4sPN.mjs" ;
import { a as MemberSection , M as MemberList } from "./MemberList-Co6ZMGts.mjs" ;
import { M as MemberRow } from "./MemberRow-DaG-K8rz.mjs" ;
import "node:fs/promises" ;
import "node:path" ;
const $$_tpl_2 = [ "<strong>gumtree</strong> · 🏷️ v3.3.2 released — " , " · Hotfix for Japanese locale" ] ;
const $$_tpl_3 = [ "<strong>gumtree</strong> · 🔀 " , " pushed to <code>fix/locale-fallback</code> — 4 files" ] ;
const $$_tpl_4 = [ "<strong>gumtree</strong> · 🔃 " , " opened: Fix locale fallback for multibyte sequences — see " , "" ] ;
const $$_tpl_5 = [ "this also explains the encoding misses. UTF-8 <code>ü</code> in the data vs Latin-1 <code>u + combining umlaut</code> from conversion" ] ;
const $$_tpl_6 = [ "<strong>cicada</strong> · ✓ " , " passed — 11/11 green (5m 22s)" ] ;
const $$_tpl_7 = [ '<div class="h-px bg-base-300 mx-2.5 my-1.5"></div>' ] ;
const $$_tpl_1 = [ '<div class="bg-[var(--bg-outer)] p-1.5"><div class="bg-base-200 flex flex-col">' , "" , "" , '<div class="drawer drawer-contained lg:drawer-open h-[400px] lg:h-[560px]"><input id="drawer-channels" type="checkbox" class="drawer-toggle"><div class="drawer-content flex flex-col min-h-0"><div class="drawer drawer-contained drawer-end lg:drawer-open h-full"><input id="drawer-members" type="checkbox" class="drawer-toggle"><div class="drawer-content flex flex-col min-h-0"><div class="flex-1 flex flex-col bg-base-100 min-w-0 min-h-0">' , "" , '<div class="flex-1 overflow-y-auto px-4 py-2">' , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "</div>" , '</div></div><div class="drawer-side z-20 h-full"><label for="drawer-members" class="drawer-overlay"></label>' , '</div></div></div><div class="drawer-side z-20 h-full"><label for="drawer-channels" class="drawer-overlay"></label>' , "</div></div>" , '</div></div><div class="mt-8 border-t border-[var(--border-card)] pt-6 overflow-x-auto"><h2 class="text-lg font-heading font-semibold mb-3">Page Source</h2>' , "</div>" ] ;
const $$_tpl_8 = [ '<div class="hidden lg:flex gap-4">' , "" , "</div>" ] ;
const $$_tpl_9 = [ '<div class="flex items-center gap-4"><div class="hidden lg:block">' , "</div>" , "</div>" ] ;
const $$_tpl_10 = [ "" , "" , "" , "" , "" , "" ] ;
const $$_tpl_11 = [ "alice is typing…" ] ;
const $$_tpl_12 = [ "🌿 <strong>EucalyptIRCd</strong> · IRCv3 · FoundationDB" ] ;
const $$_tpl_13 = [ "" , "" , "" ] ;
const $$_tpl_14 = [ "<span>!necessary/example-app · EucalyptIRCd</span>" ] ;
const $$_tpl_15 = [ '<span>4 online · 2 bots · IRCv3 · # custom · ! auto-generated</span><span class="w-px h-3 bg-base-content/20"></span><span>FoundationDB ⚡</span>' ] ;
const __source = await Deno . readTextFile ( new URL ( import . meta. url ) . pathname ) ;
const tabs = [ {
label : "Code" ,
icon : "code"
} , {
label : "Issues" ,
icon : "bug" ,
count : 7
} , {
label : "PRs" ,
icon : "git-pull-request" ,
count : 3
} , {
label : "CI" ,
icon : "pipe"
} , {
label : "Translations" ,
icon : "translate" ,
count : 14
} , {
label : "Chat" ,
icon : "chat-dots" ,
count : 3 ,
countAlert : true ,
active : true
} , {
label : "Settings" ,
icon : "gear"
} ] ;
const repoChat = define . page ( function RepoChatExample ( ) {
return a ( $$_tpl_1 , u ( Navbar , {
brand : u ( "a" , {
class : "font-heading text-secondary font-extrabold uppercase tracking-wider text-base" ,
children : "Gumtree"
} ) ,
center : a ( $$_tpl_8 , u ( "a" , {
class : "text-xs font-semibold text-[#888] hover:text-[var(--color-secondary)] flex items-center gap-1" ,
children : [ u ( Icon , {
name : "compass" ,
size : 14
} ) , " Explore" ]
} ) , u ( "a" , {
class : "text-xs font-semibold text-[#888] hover:text-[var(--color-secondary)] flex items-center gap-1" ,
children : [ u ( Icon , {
name : "tray" ,
size : 14
} ) , " My Work" ]
} ) ) ,
end : a ( $$_tpl_9 , u ( SearchInput , {
placeholder : "Search repos, issues, PRs…"
} ) , u ( Avatar , {
size : "sm" ,
placeholder : "B"
} ) )
} ) , u ( RepoHeader , {
org : "necessary" ,
repo : "example-app" ,
visibility : "Public" ,
description : "Full-stack web application with i18n, CI, and plugin support. Supports locale switching, REST API, and extensible middleware."
} ) , u ( RepoTabs , {
tabs
} ) , u ( ChatHeader , {
path : "!necessary/example-app" ,
channelType : "auto" ,
topic : "Full-stack web application with i18n, CI, and plugin support · 3 open PRs · CI passing" ,
actions : a ( $$_tpl_10 , u ( ChatHeaderAction , {
for : "drawer-channels" ,
class : "lg:hidden" ,
children : [ u ( Icon , {
name : "hash" ,
size : 11
} ) , " Channels" ]
} ) , u ( ChatHeaderAction , {
children : [ u ( Icon , {
name : "push-pin" ,
size : 11
} ) , " Pins" ]
} ) , u ( ChatHeaderAction , {
children : [ u ( Icon , {
name : "magnifying-glass" ,
size : 11
} ) , " Search" ]
} ) , u ( ChatHeaderAction , {
children : "IRC client ↗"
} ) , u ( ChatHeaderAction , {
for : "drawer-members" ,
class : "lg:hidden" ,
children : [ u ( Icon , {
name : "users-three" ,
size : 11
} ) , " Members" ]
} ) )
} ) , u ( ChatPinnedBar , {
author : "alice" ,
children : "v3.4.0 release freeze starts Monday. All feature PRs should be merged by Friday EOD."
} ) , u ( DateSeparator , {
label : "Yesterday"
} ) , u ( BotEvent , {
variant : "release" ,
children : a ( $$_tpl_2 , u ( "a" , {
children : "3 contributors, 12 commits"
} ) )
} ) , u ( ChatMessage , {
nick : "alice" ,
nickColor : "#7a3e9d" ,
time : "16:22" ,
avatarPlaceholder : "A" ,
avatarColor : "#cba6f7" ,
children : "good, the es locale fix is shipped. carol, can you ask the testers to try v3.3.2?"
} ) , u ( ChatMessage , {
nick : "carol" ,
nickColor : "#b85c00" ,
time : "16:45" ,
avatarPlaceholder : "C" ,
avatarColor : "#f9e2af" ,
reactions : u ( Reaction , {
emoji : "👍" ,
count : 1
} ) ,
children : "done, sent it to fay and grace. they'll report back tomorrow"
} ) , u ( DateSeparator , {
label : "Today"
} ) , u ( BotEvent , {
variant : "push" ,
children : a ( $$_tpl_3 , u ( "a" , {
children : "brendan"
} ) )
} ) , u ( BotEvent , {
variant : "pr" ,
children : a ( $$_tpl_4 , u ( "a" , {
children : "PR #131"
} ) , u ( ChannelRef , {
type : "auto" ,
children : "!necessary/example-app/pr/131"
} ) )
} ) , u ( ChatMessage , {
nick : "brendan" ,
nickColor : "#1a5a9a" ,
time : "12:16" ,
avatarPlaceholder : "B" ,
avatarColor : "#89b4fa" ,
children : [ "heads up — " , u ( "a" , {
children : "PR #131"
} ) , " fixes the locale bug carol reported. discussion in " , u ( ChannelRef , {
type : "auto" ,
children : "!necessary/example-app/pr/131"
} ) , ", also cross-posted to " , u ( ChannelRef , {
type : "custom" ,
children : "#design"
} ) ]
} ) , u ( ChatMessage , {
nick : "bob" ,
nickColor : "#2e7d32" ,
time : "12:20" ,
avatarPlaceholder : "B" ,
avatarColor : "#a6e3a1" ,
reactions : u ( Reaction , {
emoji : "💡" ,
count : 2
} ) ,
children : a ( $$_tpl_5 )
} ) , u ( BotEvent , {
variant : "ci" ,
children : a ( $$_tpl_6 , u ( ChannelRef , {
type : "auto" ,
children : "!necessary/example-app/ci/313"
} ) )
} ) , u ( ReadMarker , null ) , u ( ChatMessage , {
nick : "carol" ,
nickColor : "#b85c00" ,
time : "13:44" ,
avatarPlaceholder : "C" ,
avatarColor : "#f9e2af" ,
reactions : u ( Reaction , {
emoji : "🎉" ,
count : 3
} ) ,
children : [ "just tested the ja locale — 'tōkyō' predicts correctly now! posted the good news to " , u ( ChannelRef , {
type : "custom" ,
children : "#beta-testers"
} ) , " too" ]
} ) , u ( ChatMessage , {
nick : "alice" ,
nickColor : "#7a3e9d" ,
time : "14:01" ,
avatarPlaceholder : "A" ,
avatarColor : "#cba6f7" ,
children : "great work. @brendan should we ship this as v3.3.3 hotfix? it affects all 14 supported locales"
} ) , u ( ChatMessage , {
nick : "brendan" ,
nickColor : "#1a5a9a" ,
time : "14:08" ,
avatarPlaceholder : "B" ,
avatarColor : "#89b4fa" ,
reply : u ( ReplyQuote , {
nick : "alice" ,
children : "should we ship this as v3.3.3 hotfix…"
} ) ,
children : "v3.3.3 hotfix, yeah. it's a regression from the encoding change in v3.3.0 and it affects every i18n user"
} ) , u ( ChatMessage , {
nick : "bob" ,
nickColor : "#2e7d32" ,
time : "14:12" ,
avatarPlaceholder : "B" ,
avatarColor : "#a6e3a1" ,
children : "+1 for hotfix. also confirmed it fixes encoding for fr — our largest user base"
} ) , u ( ChatInput , {
placeholder : "Message !necessary/example-app…" ,
typing : a ( $$_tpl_11 )
} ) , u ( MemberList , {
children : [ u ( MemberSection , {
label : "Online — 4" ,
children : [ u ( MemberRow , {
name : "brendan" ,
status : "online" ,
avatarPlaceholder : "B" ,
avatarColor : "#89b4fa" ,
nameColor : "#1a5a9a" ,
nameBold : true ,
role : "admin"
} ) , u ( MemberRow , {
name : "alice" ,
status : "online" ,
avatarPlaceholder : "A" ,
avatarColor : "#cba6f7" ,
role : "admin"
} ) , u ( MemberRow , {
name : "bob" ,
status : "online" ,
avatarPlaceholder : "B" ,
avatarColor : "#a6e3a1"
} ) , u ( MemberRow , {
name : "carol" ,
status : "away" ,
avatarPlaceholder : "C" ,
avatarColor : "#f9e2af" ,
role : "away" ,
roleColor : "#b85c00"
} ) ]
} ) , u ( MemberSection , {
label : "Bots — 2" ,
children : [ u ( MemberRow , {
name : "gumtree" ,
status : "online" ,
avatarPlaceholder : "G" ,
avatarColor : "#eee" ,
role : "bot"
} ) , u ( MemberRow , {
name : "cicada" ,
status : "online" ,
avatarPlaceholder : "C" ,
avatarColor : "#eee" ,
role : "bot"
} ) ]
} ) , u ( MemberSection , {
label : "Offline — 8" ,
children : [ u ( MemberRow , {
name : "dave" ,
status : "offline" ,
avatarPlaceholder : "D" ,
avatarColor : "#ddd" ,
opacity : 0.5
} ) , u ( MemberRow , {
name : "eve" ,
status : "offline" ,
avatarPlaceholder : "E" ,
avatarColor : "#ddd" ,
opacity : 0.5
} ) , u ( MemberRow , {
name : "+6 more" ,
status : "offline" ,
avatarPlaceholder : "+" ,
avatarColor : "#ddd" ,
opacity : 0.4
} ) ]
} ) ]
} ) , u ( ChannelTree , {
footer : u ( TreeFooter , {
children : a ( $$_tpl_12 )
} ) ,
children : [ u ( TreeNode , {
label : "necessary" ,
icon : "building-office" ,
bold : true ,
children : [ u ( TreeSection , {
label : "Channels" ,
action : "+ New"
} ) , u ( ChannelRow , {
label : "general" ,
type : "custom" ,
depth : 1
} ) , u ( ChannelRow , {
label : "ci" ,
type : "custom" ,
depth : 1 ,
unread : true ,
badges : u ( TreeBadge , {
variant : "mention" ,
children : "@1"
} )
} ) , u ( ChannelRow , {
label : "design" ,
type : "custom" ,
depth : 1
} ) , u ( ChannelRow , {
label : "infra" ,
type : "custom" ,
depth : 1
} ) , u ( ChannelRow , {
label : "beta-testers" ,
type : "custom" ,
depth : 1
} ) , u ( TreeSection , {
label : "Repositories"
} ) , u ( TreeNode , {
label : "example-app" ,
icon : "package" ,
bold : true ,
active : true ,
badges : u ( TreeBadge , {
variant : "count" ,
children : "4"
} ) ,
children : [ u ( TreeNode , {
label : "pr" ,
icon : "arrows-clockwise" ,
iconColor : "#7a3e9d" ,
labelColor : "#7a3e9d" ,
labelWeight : "600" ,
depth : 1 ,
children : [ u ( ChannelRow , {
label : "131" ,
type : "auto" ,
depth : 2 ,
unread : true ,
badges : a ( $$_tpl_13 , u ( TreeBadge , {
variant : "unread" ,
children : "3"
} ) , u ( TreeBadge , {
variant : "state" ,
state : "open" ,
children : "open"
} ) )
} ) , u ( ChannelRow , {
label : "130" ,
type : "auto" ,
depth : 2 ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "open" ,
children : "open"
} )
} ) , u ( ChannelRow , {
label : "129" ,
type : "auto" ,
depth : 2 ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "open" ,
children : "open"
} )
} ) , u ( ChannelRow , {
label : "128" ,
type : "auto" ,
depth : 2 ,
dim : true ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "merged" ,
children : "merged"
} )
} ) , u ( ChannelRow , {
label : "126" ,
type : "auto" ,
depth : 2 ,
dim : true ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "closed" ,
children : "closed"
} )
} ) ]
} ) , u ( TreeNode , {
label : "ci" ,
icon : "lightning" ,
iconColor : "#1a5a9a" ,
labelColor : "#1a5a9a" ,
labelWeight : "600" ,
depth : 1 ,
children : [ u ( ChannelRow , {
label : "313" ,
type : "auto" ,
depth : 2 ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "pass" ,
children : "✓ pass"
} )
} ) , u ( ChannelRow , {
label : "312" ,
type : "auto" ,
depth : 2 ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "run" ,
children : "◉ run"
} )
} ) , u ( ChannelRow , {
label : "311" ,
type : "auto" ,
depth : 2 ,
dim : true ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "pass" ,
children : "✓"
} )
} ) ]
} ) , u ( TreeNode , {
label : "locale" ,
icon : "globe" ,
iconColor : "#b85c00" ,
labelColor : "#b85c00" ,
labelWeight : "600" ,
depth : 1 ,
children : [ u ( ChannelRow , {
label : "fr" ,
type : "auto" ,
depth : 2
} ) , u ( ChannelRow , {
label : "de" ,
type : "auto" ,
depth : 2
} ) , u ( ChannelRow , {
label : "ja" ,
type : "auto" ,
depth : 2
} ) ]
} ) ]
} ) , u ( TreeNode , {
label : "static-lib-build" ,
icon : "package" ,
children : u ( TreeNode , {
label : "ci" ,
icon : "lightning" ,
iconColor : "#1a5a9a" ,
labelColor : "#1a5a9a" ,
labelWeight : "600" ,
depth : 1 ,
children : [ u ( ChannelRow , {
label : "89" ,
type : "auto" ,
depth : 2 ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "fail" ,
children : "✕ fail"
} )
} ) , u ( ChannelRow , {
label : "88" ,
type : "auto" ,
depth : 2 ,
dim : true ,
badges : u ( TreeBadge , {
variant : "state" ,
state : "pass" ,
children : "✓"
} )
} ) ]
} )
} ) , u ( TreeNode , {
label : "api-server" ,
icon : "package" ,
expanded : false
} ) , u ( TreeNode , {
label : "example-spell" ,
icon : "package" ,
expanded : false
} ) , u ( TreeNode , {
label : "lang-core" ,
icon : "package" ,
expanded : false ,
dim : true
} ) , u ( TreeNode , {
label : "lang-data" ,
icon : "package" ,
expanded : false ,
dim : true
} ) ]
} ) , a ( $$_tpl_7 ) , u ( TreeNode , {
label : "Direct Messages" ,
icon : "chat" ,
bold : true ,
children : [ u ( DMRow , {
name : "alice" ,
status : "online"
} ) , u ( DMRow , {
name : "bob" ,
status : "online"
} ) , u ( DMRow , {
name : "carol" ,
status : "away"
} ) , u ( DMRow , {
name : "dave" ,
status : "offline"
} ) ]
} ) ]
} ) , u ( StatusBar , {
left : a ( $$_tpl_14 ) ,
right : a ( $$_tpl_15 )
} ) , u ( CodeBlock , {
code : __source
} ) ) ;
} ) ;
const routeCss = null ;
const css = routeCss ;
const config = void 0 ;
const handler = void 0 ;
const handlers = void 0 ;
const _freshRoute___examples_repo_chat = repoChat ;
export {
config ,
css ,
_freshRoute___examples_repo_chat as default ,
handler ,
handlers
} ;