13 Commits

Author SHA1 Message Date
Charles Magahern
08354c8905 Some interlude pages 2025-09-07 18:39:15 -07:00
dc8ab1a0a7 Merge pull request 'fix embarrassing typo' (#6) from phajas/smartbar:phajas/vrankle_typo into master
Reviewed-on: buzzert/smartbar#6
2025-09-02 00:44:38 +00:00
Peter Hajas
4e19b2a1b0 fix embarrassing typo 2025-09-01 14:12:17 -06:00
803f07a1b7 Merge branch 'phajas-phajas/vrankle'
* phajas-phajas/vrankle:
  Add "Vrankle: A Victim"
2025-08-31 16:48:46 -06:00
fd17e511dc Adds pdfbook command 2025-08-31 16:47:15 -06:00
29030c573c Adds new pdfbook command (ai generated) 2025-08-31 16:46:54 -06:00
3fc555844b Revert "fix namespacing with CSS"
This reverts commit 896a67ca8a.
2025-08-31 16:46:54 -06:00
182ebd14b3 Merge pull request '[New Article] Pearl Street Café' (#5) from zanneth/smartbar:zanneth/pearl-street-cafe into master
Reviewed-on: buzzert/smartbar#5
2025-08-31 22:44:16 +00:00
da10b32dfa adds wtf page and interstitial hack the planet 2025-08-31 16:07:07 -06:00
Peter Hajas
4aa310c008 Add "Vrankle: A Victim" 2025-08-31 14:44:54 -06:00
8c3232c788 Adds cover page 2025-08-31 14:02:46 -06:00
f3eed964f0 Merge pull request 'fix namespacing with CSS' (#3) from phajas/smartbar:phajas/fix_namespacing into master
Reviewed-on: buzzert/smartbar#3
2025-08-31 18:53:23 +00:00
Peter Hajas
896a67ca8a fix namespacing with CSS 2025-08-31 12:46:36 -06:00
29 changed files with 695 additions and 32 deletions

View File

@@ -34,8 +34,8 @@ deps:
.PHONY: pdf
pdf: build deps
@echo "Generating PDF with headless Chrome..."
@$(GO) run ./cmd/pdf --in $(OUT_DIR)/print.html --out $(PDF)
@echo "Generating PDF by rendering each page and merging..."
@$(GO) run ./cmd/pdfbook --pages $(OUT_DIR) --order pages.yaml --out $(PDF)
.PHONY: pdf-2up
pdf-2up: build deps

View File

@@ -3,6 +3,11 @@
margin: 0;
}
@font-face {
font-family: "Heading Now";
src: url("../font/HeadingNow-95Medium.otf");
}
/* Base */
html, body {
height: 100%;
@@ -20,6 +25,39 @@ html, body {
margin: 0;
}
.interlude {
position: relative;
overflow: hidden;
color: white;
padding: 4rem;
z-index: 0; /* ensure stacking context */
}
.interlude::before {
content: '';
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
filter: grayscale(20%) brightness(0.7);
z-index: -2;
}
.interlude::after {
content: '';
position: absolute;
inset: 0;
/*background: rgba(128, 0, 128, 0.3); /* purple tint */ */
z-index: -1;
}
.interlude-caption {
color: rgba(225, 225, 225, 1.0);
font-family: "Heading Now";
line-height: 2em;
rotate: 5deg;
}
/* Use border-box sizing everywhere to keep dimensions predictable */
html { box-sizing: border-box; }
*, *::before, *::after { box-sizing: inherit; }

View File

@@ -1,3 +1,17 @@
#page {
}
@font-face {
font-family: "Heading Now";
src: url("../font/HeadingNow-95Medium.otf");
}
.ytmnd-1 {
color: #fff;
text-shadow:
0px 10px 0 rgb(209, 1, 209),
0px 20px 0 black;
}
.ytmnd-2 {
color: #fff;
text-shadow:
0px 6px 0 rgb(209, 1, 209);
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
assets/img/cover.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
assets/img/free-dirt.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
assets/img/javaguy.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

BIN
assets/img/mr-nickel.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

BIN
assets/img/vrankle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

BIN
assets/img/wtf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

View File

@@ -160,21 +160,12 @@ func main() {
panic(err)
}
// Build print.html containing all pages one after another for PDF
printTplPath := filepath.Join(templatesDir, "print.gohtml")
printTpl := template.Must(template.New("print").Parse(mustReadFile(printTplPath)))
// Prepare pages for aggregate printing (2-up, etc.)
var printPages []PrintPage
for _, pagePath := range pageFiles {
content := strings.TrimSpace(mustReadFile(pagePath))
printPages = append(printPages, PrintPage{Content: template.HTML(content)})
}
var outPrint bytes.Buffer
if err := printTpl.Execute(&outPrint, map[string]any{"Pages": printPages, "PageSizeAttr": pageSizeStyleAttr(config.PageWidthIn, config.PageHeightIn)}); err != nil {
panic(err)
}
if err := writeFile(filepath.Join(outDir, "print.html"), outPrint.Bytes()); err != nil {
panic(err)
}
// Build 2-up print HTML (letter pages with two half-letter pages side by side)
var sheets []TwoUpSheet

158
cmd/pdfbook/main.go Normal file
View File

@@ -0,0 +1,158 @@
package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"smartbar/internal/config"
"github.com/chromedp/cdproto/emulation"
"github.com/chromedp/cdproto/page"
"github.com/chromedp/chromedp"
pdfapi "github.com/pdfcpu/pdfcpu/pkg/api"
)
func must(err error) {
if err != nil {
log.Fatal(err)
}
}
func parseYAMLListOfStrings(src string) ([]string, error) {
var out []string
for _, line := range strings.Split(src, "\n") {
line = strings.TrimSpace(line)
if line == "" || strings.HasPrefix(line, "#") {
continue
}
if strings.HasPrefix(line, "-") {
item := strings.TrimSpace(strings.TrimPrefix(line, "-"))
if item != "" {
out = append(out, item)
}
} else {
return nil, fmt.Errorf("invalid yaml line (expect '- item'): %s", line)
}
}
return out, nil
}
func findChromeExec() (string, error) {
if v := os.Getenv("CHROME_PATH"); v != "" {
return v, nil
}
candidates := []string{"google-chrome-stable", "google-chrome", "chromium-browser", "chromium", "chrome"}
for _, name := range candidates {
if p, err := exec.LookPath(name); err == nil {
return p, nil
}
}
// macOS common app bundle paths
macPaths := []string{
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
"/Applications/Chromium.app/Contents/MacOS/Chromium",
}
for _, p := range macPaths {
if _, err := os.Stat(p); err == nil {
return p, nil
}
}
return "", fmt.Errorf("no Chrome/Chromium executable found; set CHROME_PATH or install chromium/google-chrome")
}
func main() {
var (
pagesDir string
orderPath string
outPDF string
width float64
height float64
)
flag.StringVar(&pagesDir, "pages", "_dist", "path to compiled pages directory (required)")
flag.StringVar(&orderPath, "order", "pages.yaml", "path to YAML file listing page order (required)")
flag.StringVar(&outPDF, "out", "_dist/output.pdf", "output PDF path (required)")
flag.Float64Var(&width, "w", config.PageWidthIn, "page width in inches")
flag.Float64Var(&height, "h", config.PageHeightIn, "page height in inches")
flag.Parse()
if pagesDir == "" || orderPath == "" || outPDF == "" {
log.Fatal("--pages, --order and --out are required")
}
// Load order
data, err := os.ReadFile(orderPath)
must(err)
ordered, err := parseYAMLListOfStrings(string(data))
must(err)
// Resolve Chrome
chromeExec, err := findChromeExec()
must(err)
opts := append(chromedp.DefaultExecAllocatorOptions[:], chromedp.ExecPath(chromeExec), chromedp.Flag("headless", true), chromedp.Flag("disable-gpu", true), chromedp.Flag("hide-scrollbars", true))
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
ctx, cancel := chromedp.NewContext(allocCtx)
defer cancel()
// Temp dir for individual PDFs
tmpDir, err := os.MkdirTemp("", "smartbar_pdfs_*")
must(err)
defer os.RemoveAll(tmpDir)
var partPDFs []string
for _, rel := range ordered {
abs := filepath.Join(pagesDir, rel)
if _, err := os.Stat(abs); err != nil {
log.Printf("skip missing page: %s", rel)
continue
}
absHTML, _ := filepath.Abs(abs)
url := "file://" + absHTML
outPath := filepath.Join(tmpDir, strings.TrimSuffix(filepath.Base(rel), filepath.Ext(rel)) + ".pdf")
// Render one page PDF via printToPDF
err := chromedp.Run(ctx, chromedp.Tasks{
chromedp.Navigate(url),
chromedp.ActionFunc(func(ctx context.Context) error {
if err := emulation.SetEmulatedMedia().WithMedia("print").Do(ctx); err != nil {
return err
}
params := page.PrintToPDF().
WithPaperWidth(width).
WithPaperHeight(height).
WithMarginTop(0).WithMarginBottom(0).WithMarginLeft(0).WithMarginRight(0).
WithPrintBackground(true)
buf, _, err := params.Do(ctx)
if err != nil {
return err
}
return os.WriteFile(outPath, buf, 0o644)
}),
})
must(err)
partPDFs = append(partPDFs, outPath)
}
if len(partPDFs) == 0 {
log.Fatal("no pages produced; check order file")
}
// Merge PDFs into single output
must(os.MkdirAll(filepath.Dir(outPDF), 0o755))
// pdfcpu expects []string in order and writes outPDF
must(pdfapi.MergeCreateFile(partPDFs, outPDF, false, nil))
fmt.Printf("Wrote %s (%d pages)\n", outPDF, len(partPDFs))
}

17
go.mod
View File

@@ -1,11 +1,14 @@
module smartbar
go 1.21
go 1.23.0
toolchain go1.24.2
require (
github.com/chromedp/cdproto v0.0.0-20240202021202-6d0b6a386732
github.com/chromedp/chromedp v0.9.5
github.com/fsnotify/fsnotify v1.9.0
github.com/pdfcpu/pdfcpu v0.11.0
)
require (
@@ -13,7 +16,17 @@ require (
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gobwas/ws v1.3.2 // indirect
github.com/hhrutter/lzw v1.0.0 // indirect
github.com/hhrutter/pkcs7 v0.2.0 // indirect
github.com/hhrutter/tiff v1.0.2 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
golang.org/x/sys v0.16.0 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
golang.org/x/crypto v0.38.0 // indirect
golang.org/x/image v0.27.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

28
go.sum
View File

@@ -12,14 +12,40 @@ github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.3.2 h1:zlnbNHxumkRvfPWgfXu8RBwyNR1x8wh9cf5PTOCqs9Q=
github.com/gobwas/ws v1.3.2/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY=
github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0=
github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo=
github.com/hhrutter/pkcs7 v0.2.0 h1:i4HN2XMbGQpZRnKBLsUwO3dSckzgX142TNqY/KfXg+I=
github.com/hhrutter/pkcs7 v0.2.0/go.mod h1:aEzKz0+ZAlz7YaEMY47jDHL14hVWD6iXt0AgqgAvWgE=
github.com/hhrutter/tiff v1.0.2 h1:7H3FQQpKu/i5WaSChoD1nnJbGx4MxU5TlNqqpxw55z8=
github.com/hhrutter/tiff v1.0.2/go.mod h1:pcOeuK5loFUE7Y/WnzGw20YxUdnqjY1P0Jlcieb/cCw=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo=
github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw=
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
github.com/pdfcpu/pdfcpu v0.11.0 h1:mL18Y3hSHzSezmnrzA21TqlayBOXuAx7BUzzZyroLGM=
github.com/pdfcpu/pdfcpu v0.11.0/go.mod h1:F1ca4GIVFdPtmgvIdvXAycAm88noyNxZwzr9CpTy+Mw=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=
golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

View File

@@ -1,11 +1,18 @@
# locations in pages/
- cover.html
- bouba.html
- hack-the-planet.html
- wtf.html
- drivingmissmuni.html
- vranklevictim.html
- pearlstreetcafe.html
- gtkapplang-1.html
- gtkapplang-2.html
- gtkapplang-3.html
- gtkapplang-4.html
- drivingmissmuni.html
- pearlstreetcafe.html
- broken-screen.html
- windows-shirt.html
- free-dirt.html
- mr-nickel.html
- javaguy.html

View File

@@ -1,9 +0,0 @@
<style>
#bouba-page {
background-color: red;
}
</style>
<div id="bouba-page" class="page-base">
This is a test kiki.
</div>

19
pages/broken-screen.html Normal file
View File

@@ -0,0 +1,19 @@
<style>
#broken-screen::before {
background-image: url("assets/img/broken-screen.jpg");
}
#broken-screen-caption {
position: absolute;
bottom: 25%;
right: 15%;
text-align: right;
}
</style>
<div id="broken-screen" class="page-base interlude">
<div class="interlude-caption" id="broken-screen-caption">
have you tried<br/>
turning it off and on again?
</div>
</div>

View File

@@ -1,9 +1,49 @@
<style>
#cover-page {
background-color: green;
position: relative;
background:
linear-gradient(rgba(0,0,0,0.35), rgba(0,0,0,0.35)),
url("assets/img/cover.jpg") no-repeat center center;
background-size: cover;
}
#logo {
position: absolute;
top: 29px;
left: 8px;
transform: scaleY(1.85);
font-family: "Heading Now";
font-size: 68px;
color: #fff;
text-shadow:
0px 10px 0 rgb(209, 1, 209),
0px 20px 0 black;
}
#edition {
position: absolute;
right: 8px;
bottom: 20px;
transform: scaleY(0.8);
font-family: "Heading Now";
font-size: 32px;
text-align: right;
}
</style>
<div id="cover-page" class="page-base">
welcome to smart bar
<div id="logo" class="ytmnd-1">smart bar</div>
<div id="edition" class="ytmnd-2">
<div>sf cyberculture zine</div>
<div>issue 1, 2025</div>
</div>
</div>

15
pages/free-dirt.html Normal file
View File

@@ -0,0 +1,15 @@
<style>
#free-dirt::before {
background-image: url("assets/img/free-dirt.jpg");
}
#free-dirt-caption {
position: absolute;
bottom: 25%;
right: 25%;
}
</style>
<div id="free-dirt" class="page-base interlude">
<div class="interlude-caption" id="free-dirt-caption">thanks...</div>
</div>

View File

@@ -0,0 +1,10 @@
<style>
#hack-the-planet-page {
background: url("assets/img/hack-the-planet.jpg") no-repeat center center;
background-size: cover;
}
</style>
<div id="hack-the-planet-page" class="page-base">
</div>

18
pages/javaguy.html Normal file
View File

@@ -0,0 +1,18 @@
<style>
#javaguy::before {
background-image: url("assets/img/javaguy.jpg");
}
#javaguy-caption {
position: absolute;
top: 5%;
left: 5%;
}
</style>
<div id="javaguy" class="page-base interlude">
<div class="interlude-caption" id="javaguy-caption">
i'm living in the real world<br/>
and he's living in a <em>virtual machine...</em><br/>
</div>
</div>

19
pages/mr-nickel.html Normal file
View File

@@ -0,0 +1,19 @@
<style>
#mr-nickel::before {
background-image: url("assets/img/mr-nickel.jpg");
}
#mr-nickel-caption {
position: absolute;
bottom: 10%;
right: 5%;
}
</style>
<div id="mr-nickel" class="page-base interlude">
<div class="interlude-caption" id="mr-nickel-caption">
mr. nickel says<br/>
the financial collapse is imminent<br/>
and it's all your fault!
</div>
</div>

148
pages/vranklevictim.html Normal file
View File

@@ -0,0 +1,148 @@
<meta charset="UTF-8">
<style>
body {
width: 5.5in;
height: 8.5in;
position: relative;
font-family: sans-serif;
}
h1,h2,h3 {
text-align: center;
margin-top: 8px;
margin-bottom: 8px;
}
h1 {
font-size: 4rem;
font-weight: bold;
font-family: "Impact";
color: darkred;
rotate: 5deg;
border: solid;
border-width: 0.125in;
padding: 8px;
border-radius: 16px;
}
h2 {
margin-left: 0.25in;
margin-right: 0.25in;
font-size: 1.4rem;
}
p {
margin-top: 4px;
margin-bottom: 4px;
margin-left: 0.25in;
margin-right: 0.25in;
text-align: justify;
}
.root {
height: 100%;
width: 100%;
background: linear-gradient(
to bottom,
grey 0%,
black 45%,
black, black
);
color: white;
display: flex;
flex-direction: column;
align-items: center;
}
div * {
z-index: 2;
}
img {
margin-top: 2.85in;
width: 50%;
position: absolute;
z-index: 1;
rotate: -10deg;
scale: 115%;
filter: saturate(0.45) sepia(0.8) brightness(0.6);
}
aside {
width: 100%;
text-transform: uppercase;
text-align: center;
margin-left: 0.25in;
margin-right: 0.25in;
}
figure {
margin: 0px;
padding: 0px;
}
.logo {
text-transform: uppercase;
background-image: radial-gradient(yellow, goldenrod);
color: transparent;
background-clip: text;
font-family: sans-serif;
font-weight: bold;
}
.byline {
background-color: #F0E0D6;
position: absolute;
right: 0px;
bottom: 0px;
font-size: 1em;
}
</style>
<div class="root">
<aside style="position: absolute; top: 0;">
Coming exclusively to <span class="logo">ULTRA-PLUS®</span> on Christmas Day
</aside>
<figure style="height: 0.3in"></figure>
<h1>
Vrankle: A Victim
</h1>
<img src="assets/img/vrankle.png"/>
<h2>
The true story of an innocent man's struggle
</h2>
<p>
Jer Vrankle was attending a fun demonstration downtown when a brute ignorantly called his baseball cap "cool" in the co-op grocer's parking lot. Vrankle was thrust into crisis. Recovering from a small cold and running a mild fever, Jer was the opposite of "cool". The property security dismissed complaints about the comment.
</p>
<figure style="height: 2.5in;"></figure>
<p>
The 48 episode docuseries, directed by the award-winning Selgus Bango, deals with the complex struggles plaguing society today: relationships, decency, and verbal communication.
</p>
<p>
Learn about every aspect of the conflict. Make up your own mind about the innocent Jer and antagonistic brute. Hear interviews with bystanders parking in the lot, watch the security camera footage of the event, and listen to Ivy League professors unpack every detail.
</p>
<p>
Famed composer Hilden Valeigh's soundtrack is a complex mix of droning repetitive ambiance. The 9 disc soundtrack is releasing exclusively for streaming on <span class="logo">ULTRA-PLUS®</span> later this winter.
</p>
<aside style="position: absolute; bottom: 32px;">
Watch the 48 episode docuseries on <span class="logo">ULTRA-PLUS®</span>
</aside>
<div class="byline">
<span style="color: black;">by</span>
<span style="color: black;">[+]</span>
<span style="font-weight: bold; color: forestgreen;">Max Res Default</span>
</div>
</div>

19
pages/windows-shirt.html Normal file
View File

@@ -0,0 +1,19 @@
<style>
#windows-shirt::before {
background-image: url("assets/img/windows-shirt.jpg");
}
#windows-shirt-caption {
position: absolute;
bottom: 10%;
left: 10%;
}
</style>
<div id="windows-shirt" class="page-base interlude">
<div class="interlude-caption" id="windows-shirt-caption">
we line up to store<br/>
only 4 gigabytes allowed<br/>
comrade, be grateful!
</div>
</div>

136
pages/wtf.html Normal file
View File

@@ -0,0 +1,136 @@
<style>
#wtf-page {
background: url("assets/img/wtf.png") no-repeat center center;
background-size: cover;
font: 8.75pt/1.40 Tahoma, sans-serif;
padding: 10px;
hyphens: auto;
overflow-wrap: break-word;
}
h2 {
font-family: "Heading Now";
font-size: 23px;
}
h3 {
font-family: "Heading Now";
font-size: 24px;
text-align: right;
}
p {
font-family: Helvetica, sans-serif;
font-size: 12.75pt;
}
/* Windows 98 styles */
.win98-window {
background: #c0c0c0c0;
border: 2px solid;
border-color: #ffffff #404040 #404040 #ffffff; /* light top/left, dark bottom/right */
padding: 6px;
/* Vertically center the window in the page */
position: relative;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.win98-titlebar {
display: flex;
align-items: center;
margin: 0 0 6px 0;
padding: 4px 8px;
min-height: 22px;
font-weight: bold;
color: #ffffff;
background: linear-gradient(90deg, #000080 0%, #1084d0 100%);
border: 2px solid;
border-color: #ffffff #404040 #404040 #ffffff;
}
.win98-content {
background: #ffffffc0;
border: 2px solid;
border-color: #808080 #ffffff #ffffff #808080; /* inset look */
padding: 10px;
color: #000000;
line-height: 1.4;
}
.feces {
transform: skewX(-10deg);
transform-origin: bottom center;
display: inline-block;
color: rgb(154, 77, 0);
font-stretch: condensed;
font-family: inherit;
font-size: 90%;
font-weight: bold;
}
.round-boxes {
display: inline-block;
font-stretch: condensed;
font-family: inherit;
border-radius: 10px;
background: rgb(166, 205, 211);
padding: 2px 4px;
}
.real {
display: inline-block;
transform: scaleX(2.5);
transform-origin: left;
font-weight: bold;
width: 80px;
}
</style>
<div id="wtf-page" class="page-base">
<div class="win98-window">
<h1 class="win98-titlebar">wtf??? is this???</h1>
<div id="wtf-text" class="win98-content">
<h2>AH, THE CITY BY THE BAY,</h2>
<p>
If you ask me, I say the city needs some more grime. I
know thats probably not what you were thinking when
you stepped over the <span class="feces">HUMAN FECES</span>
this morning on the
way from picking up your $6 latte. And for damn sure it
wasnt what your UX designer or whatever he calls himself
was thinking when he was drawing his stupid fucking
<span class="round-boxes">ROUND BOXES</span> for the hundreth time.
</p>
<p>
Put the round boxes on ice. This is SMART BAR. The
“mission district before it was cool” publication. The
“noisebridge before they got kicked out” edition.
</p>
<p>
You see, here at SMART BAR we dont give a shit. But we
also care. No, not about you. We have our own agenda.
What is our agenda? Thats our business.
</p>
<p>
SMART BAR is the little bit o dirt that makes virtual
reality feel more <span class="real">real</span>. Its the disgusting mess of
cables behind your desk that youre constantly trying
to hide. Its the malware with the pretty UI that tries to
steal peoples bitcoin.
</p>
<p>Log on, if you dare.</p>
<h3>TRENT SNEEK</h3>
</div>
</div>
</div>

View File

@@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Print</title>
<link rel="stylesheet" href="assets/css/base.css" />
<link rel="stylesheet" href="assets/css/smartbar.css" />
<style>
/* Ensure a clean print with no gaps between pages */
@media screen { body { background: #eeeeee; } }