chore: style updates to kepler 8297b5d8
Steve Simkins · 2026-06-08 22:37 5 file(s) · +76 −9
apps/kepler/handlers.go +2 −1
54 54
	if c, err := resolveRef(repo, summary.DefaultRef); err == nil {
55 55
		if tree, err := c.Tree(); err == nil {
56 56
			if src, ok := findReadme(tree); ok {
57 -
				if html, err := renderMarkdown(src); err == nil {
57 +
				rawBase := "/r/" + summary.Name + "/raw/" + summary.DefaultRef + "/"
58 +
				if html, err := renderMarkdown(src, rawBase); err == nil {
58 59
					data.ReadmeHTML = html
59 60
					data.HasReadme = true
60 61
				}
apps/kepler/kepler +0 −0

Binary file — no preview.

apps/kepler/render.go +34 −2
7 7
	"io/fs"
8 8
	"net/http"
9 9
	"path"
10 +
	"regexp"
10 11
	"strings"
11 12
	"time"
12 13
65 66
	web.Render(tmpl, w, name, data, a.Log)
66 67
}
67 68
68 -
func renderMarkdown(source string) (template.HTML, error) {
69 +
func renderMarkdown(source, rawBase string) (template.HTML, error) {
69 70
	var buf bytes.Buffer
70 71
	if err := md.Convert([]byte(source), &buf); err != nil {
71 72
		return "", err
72 73
	}
73 -
	return template.HTML(buf.String()), nil
74 +
	out := buf.String()
75 +
	if rawBase != "" {
76 +
		out = rewriteRelativeImages(out, rawBase)
77 +
	}
78 +
	return template.HTML(out), nil
79 +
}
80 +
81 +
var imgSrcRe = regexp.MustCompile(`(<img\b[^>]*?\bsrc=")([^"]+)(")`)
82 +
83 +
func rewriteRelativeImages(html, base string) string {
84 +
	return imgSrcRe.ReplaceAllStringFunc(html, func(m string) string {
85 +
		sub := imgSrcRe.FindStringSubmatch(m)
86 +
		src := sub[2]
87 +
		if isAbsoluteRef(src) {
88 +
			return m
89 +
		}
90 +
		src = strings.TrimPrefix(src, "./")
91 +
		return sub[1] + base + src + sub[3]
92 +
	})
93 +
}
94 +
95 +
func isAbsoluteRef(s string) bool {
96 +
	if s == "" {
97 +
		return true
98 +
	}
99 +
	if strings.HasPrefix(s, "/") || strings.HasPrefix(s, "#") {
100 +
		return true
101 +
	}
102 +
	if strings.HasPrefix(s, "data:") || strings.HasPrefix(s, "//") {
103 +
		return true
104 +
	}
105 +
	return strings.Contains(s, "://")
74 106
}
75 107
76 108
func renderBlobLines(source string) template.HTML {
apps/kepler/static/styles.css +40 −0
133 133
134 134
@media (max-width: 720px) { .desktop { display: none; } }
135 135
136 +
@media (max-width: 720px) {
137 +
    .container { padding: 0 0.75rem 3rem; }
138 +
139 +
    .repo-nav { flex-wrap: wrap; gap: 0.25rem; }
140 +
    .repo-name { flex: 1 1 100%; font-size: 15px; padding: 0.25rem 0; gap: 0.5rem; }
141 +
    .repo-nav .tab:first-of-type { margin-left: 0; }
142 +
    .tab { padding: 0.4rem 0.6rem; }
143 +
144 +
    .last-commit { flex-wrap: wrap; gap: 0.25rem 0.75rem; padding: 0.5rem 0.75rem; }
145 +
    .last-commit .subject {
146 +
        flex: 1 1 100%;
147 +
        min-width: 0;
148 +
        white-space: nowrap;
149 +
        overflow: hidden;
150 +
        text-overflow: ellipsis;
151 +
    }
152 +
153 +
    .commit-title { flex-wrap: wrap; gap: 0.25rem 0.75rem; }
154 +
    .commit-title .subject { flex: 1 1 100%; font-size: 15px; }
155 +
    .commit-subtitle { flex-direction: column; align-items: flex-start; gap: 0.25rem; }
156 +
157 +
    .file-header { flex-wrap: wrap; gap: 0.25rem 0.75rem; }
158 +
159 +
    .diff-header { flex-wrap: wrap; gap: 0.25rem 0.5rem; }
160 +
    .diff-header .name { word-break: break-all; }
161 +
162 +
    .blob-code .line-num { min-width: 2.5rem; padding: 0 0.4rem 0 0.25rem; }
163 +
    .blob-code .line-code { padding-left: 0.75rem; }
164 +
    .diff-hunk td.diff-num { min-width: 1.75rem; padding: 0 0.2rem 0 0.25rem; }
165 +
    td.diff-marker { padding: 0 0.2rem 0 0.4rem; }
166 +
    .diff-hunk pre, .blob-code pre { font-size: 12px; }
167 +
168 +
    h1 { font-size: 16px; }
169 +
}
170 +
136 171
/* --- Breadcrumbs --- */
137 172
138 173
.breadcrumbs { font-size: 13px; margin-bottom: 1rem; color: var(--fg-dim); }
335 370
.readme pre {
336 371
    background: var(--bg-alt);
337 372
    padding: 0.75rem;
373 +
    margin: 0.75rem 0;
338 374
    overflow-x: auto;
339 375
    font-size: 13px;
340 376
    border-radius: 4px;
341 377
}
378 +
.readme p { margin: 0.5rem 0; }
342 379
.readme code { background: var(--bg-alt); padding: 1px 4px; font-size: 13px; border-radius: 3px; }
343 380
.readme pre code { background: transparent; padding: 0; }
344 381
.readme blockquote { border-left: 2px solid var(--border); margin: 0.75rem 0; padding-left: 0.75rem; color: var(--fg-dim); }
345 382
.readme table { border-collapse: collapse; margin: 0.75rem 0; }
346 383
.readme th, .readme td { border: 1px solid var(--border); padding: 0.25rem 0.5rem; }
347 384
.readme a { color: var(--fg); text-decoration: underline; }
385 +
.readme ul, .readme ol { padding-left: 1.5rem; margin: 0.5rem 0; }
386 +
.readme li { margin: 0.25rem 0; }
387 +
.readme li > ul, .readme li > ol { margin: 0.25rem 0; }
348 388
349 389
/* --- Error page --- */
350 390
apps/kepler/templates/index.html +0 −6
1 1
{{define "index.html"}}{{template "base.html" .}}{{end}}
2 2
{{define "title"}}{{.SiteName}}{{end}}
3 -
{{define "tabs"}}<a href="/" class="tab active">repositories</a>{{end}}
4 3
{{define "content"}}
5 4
{{if .Repos}}
6 5
<table class="repo-list">
7 -
    <thead>
8 -
        <tr>
9 -
            <th>Repository</th>
10 -
        </tr>
11 -
    </thead>
12 6
    <tbody>
13 7
        {{range .Repos}}
14 8
        <tr>