summaryrefslogtreecommitdiff
path: root/issues/015-random-landscape-background.md
diff options
context:
space:
mode:
Diffstat (limited to 'issues/015-random-landscape-background.md')
-rw-r--r--issues/015-random-landscape-background.md77
1 files changed, 77 insertions, 0 deletions
diff --git a/issues/015-random-landscape-background.md b/issues/015-random-landscape-background.md
new file mode 100644
index 0000000..4f65c98
--- /dev/null
+++ b/issues/015-random-landscape-background.md
@@ -0,0 +1,77 @@
+# [FEATURE] Random landscape background image
+
+## Description
+Use a random open licensed landscape image as the background, and replace it with a new one each refresh.
+
+## User Story
+As a user, I want a fresh landscape background on each visit for visual variety.
+
+## Technical Context
+- Affects page container/body styling
+- Needs external image source with open license
+- Consider performance and loading states
+
+## Test Strategy
+
+### Integration Test (Red)
+Test image endpoint returns valid image URL with appropriate license.
+
+```go
+func TestGetRandomBackgroundURL(t *testing.T) {
+ url := GetRandomBackgroundURL()
+
+ assert.NotEmpty(t, url)
+ assert.Contains(t, url, "unsplash") // or other source
+
+ // Verify URL is accessible
+ resp, err := http.Head(url)
+ assert.NoError(t, err)
+ assert.Equal(t, 200, resp.StatusCode)
+}
+```
+
+## Proposed Approach
+
+1. **Image Source Options:**
+ - **Unsplash Source API:** `https://source.unsplash.com/1920x1080/?landscape,nature`
+ - Free, no API key needed for basic use
+ - Redirects to random image
+ - **Pexels API:** Requires API key
+ - **Local curated set:** Bundle images, no external dependency
+
+2. **Implementation:**
+ - Set CSS `background-image` on body or main container
+ - Add loading state (solid color) while image loads
+ - Use `background-size: cover` and `background-position: center`
+
+3. **Template change:**
+ ```html
+ <body style="background-image: url('{{.BackgroundURL}}'); background-size: cover;">
+ ```
+
+ Or with CSS class and CSS variable.
+
+4. **Handler:**
+ - Generate/fetch random URL on each page load
+ - Pass to template context
+
+## Traps to Avoid
+- **Slow loads:** Large images can delay page render
+ - Use appropriate resolution (1920x1080 max)
+ - Consider lazy loading or progressive enhancement
+- **Image fails to load:** Have solid color fallback
+- **Caching:** Browser may cache image; ensure URL changes per request
+- **Dark text visibility:** May need overlay or text shadow for readability
+
+## Affected Components
+- `internal/handlers/handlers.go` (add background URL to context)
+- `web/templates/index.html` (apply background style)
+- `web/static/css/` (fallback and loading styles)
+
+## Definition of Done
+- [ ] Background image displays on page load
+- [ ] Different image on each refresh
+- [ ] Images are openly licensed
+- [ ] Fallback color while loading
+- [ ] Text remains readable over images
+- [ ] Integration test verifies URL validity