Revision 8 of 16

Reverses the styling call: the reference app now defines behavior and copy only, and every screen is restyled with Postrboard instead of Bulma and Font Awesome.

21.1 KB

+23 −36 lines of text vs revision 7 (this site's diff)

The text of revision 8 against revision 7: + marks an added line, − a removed one, with three unchanged lines of context around each change; old and new line numbers on the left where there is room.
Old New Change Line
@@ -2,9 +2,9 @@
22
33Build the complete application in this repository. Work autonomously from start to finish and stop only when the app is complete.
44
5If a minor detail is not specified, choose a reasonable solution and document it. Replicate the observable user experience of the reference app exactly: layouts, visible copy (button labels, errors, headings, tooltips, states), interactions, and the overall visual language. Do not copy the reference app's implementation or framework.
5+If a minor detail is not specified, choose a reasonable solution and document it. Replicate the observable user experience of the reference app exactly: page structure, visible copy (button labels, errors, headings, tooltips, states), and interactions (what happens, in what order, on every action). Do **not** replicate the reference app's visual design, CSS framework, icon set, or color palette — restyle every screen using this repository's own Postrboard design system instead. Do not copy the reference app's implementation or framework.
66
7Reference app (source of truth for UX): `the-urlist/blazor-static-web-apps` at https://github.com/the-urlist/blazor-static-web-apps — see `Client/Pages/*.razor`, `Client/Shared/*.razor`, and `Client/wwwroot/css/app.css` for exact copy, layout, and design tokens. A live demo (if available) is linked from that repository's README.
7+Reference app (source of truth for UX behavior and copy only, not visuals): `the-urlist/blazor-static-web-apps` at https://github.com/the-urlist/blazor-static-web-apps — see `Client/Pages/*.razor` and `Client/Shared/*.razor` for exact copy, layout structure, and interaction behavior. Ignore `Client/wwwroot/css/app.css` and its Bulma/Font Awesome styling entirely. A live demo (if available) is linked from that repository's README.
88
99## Technical specification and checklist
1010
@@ -29,22 +29,9 @@
2929
3030Use the Node.js runtime, not Edge, for SQLite, sessions, file access, and metadata fetching.
3131
32Design system: replicate the reference app's visual language, which is **Bulma CSS** (0.9.x) with **Font Awesome 5.6.3** icons and the **Roboto** font at an 18px base size. Use these exact design tokens:
33
34- Primary: `#20ae96` (teal). Danger/error: `#d9255e`.
35- Light theme: text `#222c38`, main background `#fff`, section background `#f9fafc`, card shadow `0 50px 40px -40px #e8e8e8`.
36- Dark theme: text `#fff`, main background `#14161a`, section background `#353638`, card shadow `0 50px 40px -40px #292727`.
37- Cards: 4px border radius; inputs/textareas: 3.5rem height, 1px `#979797` border, 4px radius, `outline: none`.
38- Invalid input state: 4px `--danger` border with a ~0.6s horizontal shake animation, plus the field's error text below it.
39
40Use these image assets (recreate equivalent SVG/PNG files under a `public/images/` directory using the same filenames):
32+Design system: use this repository's **Postrboard** design system for every screen — invoke and follow its skill/guidelines (native components first, restrained and honest content, no generic AI design) rather than the reference app's Bulma/Font Awesome look. Do not port Bulma classes, Font Awesome icons, the Roboto font, or the reference app's color tokens, shadows, or animations. Where the reference app conveys state or affordance visually (e.g., an invalid-input highlight, a disabled button, a loading skeleton, a toast/modal), reproduce that same *behavior* — something is visibly invalid, disabled, loading, or confirmed — using Postrboard's own components and idioms, not its specific CSS.
4133
42- `logo.svg` (navbar brand, 100×60, light theme) and `logo-dark.svg` (navbar brand, dark theme)
43- `banner-logo-large.svg` (home hero, 500×500)
44- `burger.svg` (mobile menu toggle, ~60×60)
45- `no-image.png` (link image placeholder)
46- `bg.png` (small dot texture for My Lists tiles)
47- `urly.png` (not-found mascot, 500×500, a sad green fuzzy character)
34+Icons, illustrations, and images: recreate each reference asset's *purpose* (brand mark, mobile menu affordance, hero illustration, image placeholder, tile texture, not-found mascot) as a Postrboard-native equivalent instead of copying the source SVG/PNG files or filenames.
4835
4936## Product
5037
@@ -73,14 +60,14 @@
7360
7461### Navigation bar
7562
76Bulma navbar. Left: logo (alt "urlist logo"); on mobile, a hamburger button (`burger.svg`) that toggles the menu. Menu items in this order, each an icon plus label:
63+A Postrboard-styled navbar. Left: brand/logo (alt "urlist logo"); on mobile, a menu toggle that expands the menu. Menu items in this order, each an icon plus label (use Postrboard's own icon set, matching each icon's meaning below, not a specific glyph):
7764
781. `New` — icon `fas fa-plus-circle`
792. `My Lists` — icon `fas fa-user-circle` — **only when signed in**
803. `About` — external link `https://aka.ms/theurlist`, icon `fas fa-question-circle`
814. `Terms` — link to `/s/terms`, icon `fas fa-info`
65+1. `New` — a "create/add" icon
66+2. `My Lists` — a "user/account" icon — **only when signed in**
67+3. `About` — external link `https://aka.ms/theurlist`, a "help/question" icon
68+4. `Terms` — link to `/s/terms`, an "info" icon
8269
83Right: theme dropdown, then either the Login item (icon `fas fa-sign-in-alt`, label "Login", opens the login modal) or the signed-in user's avatar and name with a dropdown showing "Signed in with {provider}" and a "Log Out" item (icon `fas fa-sign-out-alt`).
70+Right: theme dropdown, then either the Login item (a "sign in" icon, label "Login", opens the login modal) or the signed-in user's avatar and name with a dropdown showing "Signed in with {provider}" and a "Log Out" item (a "sign out" icon).
8471
8572Clicking `New` while on `/s/new` with a non-empty draft must pop a confirm modal: title **"Clear this list?"**, prompt **"This will reset the current list and you will lose all changes. Are you sure you want to do that?"** with OK/Cancel. On OK, reset the draft and go to `/s/new`. Otherwise, clicking `New` resets the draft and goes to `/s/new`.
8673
@@ -94,7 +81,7 @@
9481 1. H1: **Group links, Save & Share them with the world** — the single words "Group", "Save", and "Share" rendered in the primary teal color.
9582 2. Paragraph: **Add links to a list and share it with one simple URL.**
9683 3. Paragraph: **Create a list anonymously or login to save, manage, and edit your lists.**
97- Right column: `banner-logo-large.svg` (lazy loaded, 500×500).
84+- Right column: a Postrboard-native hero illustration (lazy loaded, roughly 500×500), in place of the reference app's `banner-logo-large.svg`.
9885
9986Bottom section on a distinct background: a centered, bold, primary-colored H2 **Get Started**, followed by the first-link input widget.
10087
@@ -123,7 +110,7 @@
123110
124111When the list has links, show a "Links" heading with a right-aligned hint **"Drag links to re-order"**, then the linked rows.
125112
126Each row: a drag grip (`fas fa-grip-vertical`) at the far left; a 64px image (24px on mobile) or the `no-image.png` placeholder; a **Title** text input (placeholder "Enter a title", bold text); a **Description** textarea (placeholder "Enter a description"); a **URL** text input showing the destination (editable); and a delete button (`fas fa-times`) that removes the row immediately with **no confirmation**.
113+Each row: a drag grip icon at the far left; a 64px image (24px on mobile) or a Postrboard-native placeholder in its place; a **Title** text input (placeholder "Enter a title", bold text); a **Description** textarea (placeholder "Enter a description"); a **URL** text input showing the destination (editable); and a delete icon button that removes the row immediately with **no confirmation**.
127114
128115While a link's metadata fetch is in flight, show a small progress bar overlay on that row; when it settles the progress bar disappears. There are no per-link status badges or error messages: failed metadata simply leaves the fields as they are (or empty) and clears the progress bar.
129116
@@ -153,11 +140,11 @@
153140
154141## Login and ownership
155142
156Show a login modal styled like the reference app: a heading "Sign in to" with the logo, then three full-width colored provider buttons, in this order, each with its provider icon:
143+Show a login modal following the reference app's structure: a heading "Sign in to" with the logo, then three full-width provider buttons styled with Postrboard's components, in this order, each with its provider's icon:
157144
1581. **"with Twitter/X"** (`fab fa-twitter`)
1592. **"with GitHub"** (`fab fa-github`)
1603. **"with Google"** (`fab fa-google`)
145+1. **"with Twitter/X"**
146+2. **"with GitHub"**
147+3. **"with Google"**
161148
162149This app is local and must not call any real identity provider. Each button signs in as a stable fictional user stored in SQLite; map each provider button to a distinct mock identity (at least two distinct users total) and render that user's name and avatar in the navbar. Ownership is the (stable user ID, provider) pair, not the display name.
163150
@@ -170,7 +157,7 @@
170157Login required. H2 (large, medium weight, primary color): **"My Lists"**. Then a responsive grid of tiles: 1 column on mobile, 2 on tablet, 3 on desktop, 4 on widescreen.
171158
172159- First tile: a dashed placeholder tile containing a large **+** and the text **"Create new list"**; clicking it starts a fresh draft and goes to `/s/new`.
173- Per-list tile: the `bg.png` dot texture in the card; a primary-colored tag reading **"{N} Links"** (e.g. "4 Links"); the vanity URL as the title; the description below it (omitted when empty). The whole tile is clickable and loads that list into the editor state, then goes to `/s/edit`.
160+- Per-list tile: a Postrboard-native subtle texture/background in the card (in place of the reference app's `bg.png` dots); a primary-colored tag reading **"{N} Links"** (e.g. "4 Links"); the vanity URL as the title; the description below it (omitted when empty). The whole tile is clickable and loads that list into the editor state, then goes to `/s/edit`.
174161- While loading: 3 skeleton tiles. If the request fails, show an empty grid without error text.
175162
176163There is **no Deleted section and no Restore action**.
@@ -187,19 +174,19 @@
187174
188175- Heading: the list's **description** (large, primary color). No fallback needed.
189176- Share row (left, a connected group of icon buttons, all opening in a new tab, URL-encoded):
190 - X/Twitter: `https://twitter.com/intent/tweet?text={description} https://theurlist.com/{vanity}` — icon `fab fa-twitter`
191 - Facebook: `https://www.facebook.com/sharer/sharer.php?u=https://theurlist.com/{vanity}` — icon `fab fa-facebook-f`
192 - LinkedIn: `https://www.linkedin.com/shareArticle?mini=true&summary={description}&url=https://theurlist.com/{vanity}` — icon `fab fa-linkedin-in`
193- View toggle (right, a connected group of two icon buttons with an accessible selected state): **"View as List"** (`fas fa-list-ul`) and **"View as QR Code"** (`fas fa-qrcode`).
177+ - X/Twitter: `https://twitter.com/intent/tweet?text={description} https://theurlist.com/{vanity}`
178+ - Facebook: `https://www.facebook.com/sharer/sharer.php?u=https://theurlist.com/{vanity}`
179+ - LinkedIn: `https://www.linkedin.com/shareArticle?mini=true&summary={description}&url=https://theurlist.com/{vanity}`
180+- View toggle (right, a connected group of two icon buttons with an accessible selected state): **"View as List"** and **"View as QR Code"**.
194181- QR view: a centered, scannable QR code SVG of the URL `https://theurlist.com/{vanity}` (4x module scale, colors `#121212` on `#F9FAFC`, error correction medium).
195182- List view: link cards in stored order. Each card is itself a link opening the destination in a new tab (`rel="noopener noreferrer"`), showing the 64px image or placeholder, the bold title (fall back to the destination URL), the description (omitted when empty), and the plain destination URL.
196183- Below the cards, a link **"Report this list"** that opens a mailto to `support@theurlist.com` with subject "LinkBundle Flagged" and the list URL in the body.
197184
198When the alias does not resolve to an active list, show the not-found state instead: the `urly.png` mascot (500×500, alt "Sad green fuzzy"), H2 **"We couldn't find that Urlist"**, and H3 **"But don't be sad! That means {vanity} is still available."** where the alias is a link. Clicking that alias starts a fresh draft pre-filled with it and goes to `/s/new`. There is no tombstone or "deleted" state.
185+When the alias does not resolve to an active list, show the not-found state instead: a Postrboard-native "not found" illustration or icon (in place of the reference app's mascot image), H2 **"We couldn't find that Urlist"**, and H3 **"But don't be sad! That means {vanity} is still available."** where the alias is a link. Clicking that alias starts a fresh draft pre-filled with it and goes to `/s/new`. There is no tombstone or "deleted" state.
199186
200187## Theme, responsive UI, and accessibility
201188
202Provide a theme control in the navbar: a hoverable dropdown whose button shows the currently active theme's icon, with items (icon + label, checkmark on the active one): **Light** (`fas fa-sun`), **Dark** (`fas fa-moon`), **System** (`fas fa-desktop`). Persist the choice (e.g. `localStorage["preferredTheme"]`, default `"system"`), apply it via a `data-theme` attribute on `<html>`, and set it with an inline script before first paint to avoid a wrong-theme flash. System follows the OS preference. The dark theme swaps the navbar logo to `logo-dark.svg`.
189+Provide a theme control in the navbar: a hoverable dropdown whose button shows the currently active theme's icon, with items (icon + label, checkmark on the active one): **Light**, **Dark**, **System**. Persist the choice (e.g. `localStorage["preferredTheme"]`, default `"system"`), apply it via a `data-theme` attribute on `<html>`, and set it with an inline script before first paint to avoid a wrong-theme flash. System follows the OS preference. Use Postrboard's own light/dark logo or brand-mark variants (not the reference app's `logo-dark.svg`).
203190
204191Support current Chromium from desktop down to 320 CSS pixels with no page-level horizontal scrolling; the editor, modals, and public page must remain usable.
205192