From abf84df32e55e9bf310766dde99e368a126640d6 Mon Sep 17 00:00:00 2001 From: Will Norris Date: Tue, 21 Jun 2022 09:25:14 -0700 Subject: [PATCH] cmd/golink: provide user documentation Add a new /.help URL which contains a first pass at user docs, covering naming rules for short links, using go templates, and basic API access. Also add client side validation for short name and a link to help page. Change-Id: I4b66793248eba17e567c4f422ee197617f74ee24 --- golink.go | 21 +- package.json | 1 + static/base.css | 468 +++++++++++++++++++++++++++++++++- static/images/create-link.png | Bin 0 -> 25461 bytes tailwind.config.js | 17 +- home.html => tmpl/base.html | 33 +-- tmpl/help.html | 129 ++++++++++ tmpl/home.html | 30 +++ yarn.lock | 24 ++ 9 files changed, 679 insertions(+), 44 deletions(-) create mode 100644 static/images/create-link.png rename home.html => tmpl/base.html (50%) create mode 100644 tmpl/help.html create mode 100644 tmpl/home.html diff --git a/golink.go b/golink.go index d2e6da3..720c7cb 100644 --- a/golink.go +++ b/golink.go @@ -47,7 +47,7 @@ var stats struct { //go:embed link-snapshot.json var lastSnapshot []byte -//go:embed *.html static +//go:embed static tmpl/*.html var embeddedFS embed.FS // db stores short links. @@ -89,6 +89,7 @@ func main() { http.HandleFunc("/", serveGo) http.HandleFunc("/.export", serveExport) + http.HandleFunc("/.help", serveHelp) http.Handle("/_/export", http.RedirectHandler("/.export", http.StatusMovedPermanently)) http.Handle("/.static/", http.StripPrefix("/.", http.FileServer(http.FS(embeddedFS)))) @@ -120,23 +121,27 @@ func main() { } } -// homeCreate is the template used by the http://go/ index page where you can +// homeTmpl is the template used by the http://go/ index page where you can // create or edit links. -var homeCreate *template.Template +var homeTmpl *template.Template + +// helpTmpl is the template used by the http://go/.help page +var helpTmpl *template.Template type visitData struct { Short string NumClicks int } -// homeData is the data used by the homeCreate template. +// homeData is the data used by the homeTmpl template. type homeData struct { Short string Clicks []visitData } func init() { - homeCreate = template.Must(template.ParseFS(embeddedFS, "home.html")) + homeTmpl = template.Must(template.ParseFS(embeddedFS, "tmpl/base.html", "tmpl/home.html")) + helpTmpl = template.Must(template.ParseFS(embeddedFS, "tmpl/base.html", "tmpl/help.html")) } // initStats initializes the in-memory stats counter with counts from db. @@ -199,12 +204,16 @@ func serveHome(w http.ResponseWriter, short string) { return clicks[i].Short < clicks[j].Short }) - homeCreate.Execute(w, homeData{ + homeTmpl.Execute(w, homeData{ Short: html.EscapeString(short), Clicks: clicks, }) } +func serveHelp(w http.ResponseWriter, r *http.Request) { + helpTmpl.Execute(w, nil) +} + func serveGo(w http.ResponseWriter, r *http.Request) { if r.RequestURI == "/" { switch r.Method { diff --git a/package.json b/package.json index 00b64fd..654f315 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ }, "devDependencies": { "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/typography": "^0.5.2", "tailwindcss": "^3.0.24" } } diff --git a/static/base.css b/static/base.css index 8150cb9..d7b5a7c 100644 --- a/static/base.css +++ b/static/base.css @@ -671,6 +671,422 @@ select { } } +.prose { + color: #333; + max-width: 65ch; +} + +.prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~="not-prose"] *)) { + color: #3182ce; + text-decoration: underline; + font-weight: 500; +} + +.prose :where(a):not(:where([class~="not-prose"] *)):hover { + color: #2c5282; +} + +.prose :where(strong):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; +} + +.prose :where(ol):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; + padding-left: 1.625em; +} + +.prose :where(ol[type="A"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="A" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="I"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="I" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="1"]):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~="not-prose"] *)) { + list-style-type: disc; + padding-left: 1.625em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(hr):not(:where([class~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-left-width: 0.25rem; + border-left-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-left: 1em; +} + +.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"] *))::before { + content: open-quote; +} + +.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~="not-prose"] *)) { + font-weight: 900; +} + +.prose :where(h2):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~="not-prose"] *)) { + font-weight: 800; +} + +.prose :where(h3):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; +} + +.prose :where(h4):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; +} + +.prose :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose :where(code):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::before { + content: ; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::after { + content: ; +} + +.prose :where(a code):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-links); +} + +.prose :where(pre):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-right: 1.1428571em; + padding-bottom: 0.8571429em; + padding-left: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); +} + +.prose :where(thead th):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~="not-prose"] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~="not-prose"] *)) { + vertical-align: baseline; + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(h2 code):not(:where([class~="not-prose"] *)) { + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~="not-prose"] *)) { + font-size: 0.9em; +} + +.prose :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; +} + +.prose > :where(ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose > :where(ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose > :where(ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose > :where(ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose > :where(ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose :where(tbody td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(tbody td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose > :where(:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose > :where(:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; +} + +.absolute { + position: absolute; +} + .m-2 { margin: 0.5rem; } @@ -680,6 +1096,11 @@ select { margin-right: auto; } +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + .my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; @@ -693,6 +1114,10 @@ select { margin-top: 1.5rem; } +.mr-2 { + margin-right: 0.5rem; +} + .block { display: block; } @@ -713,10 +1138,18 @@ select { min-height: 100vh; } +.max-w-4xl { + max-width: 56rem; +} + .max-w-full { max-width: 100%; } +.max-w-5xl { + max-width: 64rem; +} + .flex-1 { flex: 1 1 0%; } @@ -759,14 +1192,14 @@ select { border-bottom-width: 1px; } -.border-r-0 { - border-right-width: 0px; -} - .border-t { border-top-width: 1px; } +.border-r-0 { + border-right-width: 0px; +} + .border-gray-200 { --tw-border-opacity: 1; border-color: rgb(230 228 226 / var(--tw-border-opacity)); @@ -823,6 +1256,10 @@ select { padding-bottom: 0.25rem; } +.pt-2 { + padding-top: 0.5rem; +} + .pt-6 { padding-top: 1.5rem; } @@ -831,10 +1268,6 @@ select { padding-right: 2rem; } -.pt-2 { - padding-top: 0.5rem; -} - .text-left { text-align: left; } @@ -862,6 +1295,11 @@ select { line-height: 1rem; } +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + .font-bold { font-weight: 700; } @@ -889,6 +1327,20 @@ select { color: rgb(159 153 149 / var(--tw-text-opacity)); } +.text-blue-200 { + color: rgba(43, 123, 185, 0.15); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(74 125 221 / var(--tw-text-opacity)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(77 120 200 / var(--tw-text-opacity)); +} + .placeholder\:text-gray-400::-moz-placeholder { --tw-text-opacity: 1; color: rgb(182 176 173 / var(--tw-text-opacity)); diff --git a/static/images/create-link.png b/static/images/create-link.png new file mode 100644 index 0000000000000000000000000000000000000000..94ca4d1d229ef30d13df81e481c809bdc7ddcded GIT binary patch literal 25461 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 literal 0 HcmV?d00001 diff --git a/tailwind.config.js b/tailwind.config.js index ab66f51..8ddfa34 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,5 +1,5 @@ module.exports = { - content: ["./*.html"], + content: ["./tmpl/*.html"], theme: { colors: { blue: { @@ -27,8 +27,23 @@ module.exports = { white: '#fff', current: 'currentColor', }, + extend: { + typography: { + DEFAULT: { + css: { + 'code::before': { + 'content': '', + }, + 'code::after': { + 'content': '', + }, + }, + }, + }, + }, }, plugins: [ require('@tailwindcss/forms'), + require('@tailwindcss/typography'), ], } diff --git a/home.html b/tmpl/base.html similarity index 50% rename from home.html rename to tmpl/base.html index 3e397e8..1414a31 100644 --- a/home.html +++ b/tmpl/base.html @@ -1,4 +1,5 @@ - + + go/ @@ -7,39 +8,13 @@
-

go/

+

go/

A private shortlink service for your tailnet
-

Create a new link

- -
-
- - - -
- - -
- -

Popular Links

- - - - - - - - - {{range .Clicks}} - - {{end}} - -
LinkClicks
go/{{.Short}}{{.NumClicks}}
+ {{ block "main" .}}{{ end }}