necessary/example-app
Public

Full-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 files
gumtree · 🔃 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
brendanadmin
A
aliceadmin
B
bob
C
carolaway
Bots — 2
G
gumtreebot
C
cicadabot
Offline — 8
D
dave
E
eve
+
+6 more
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
};