Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
04b4de9
feature: render catalog-driven bands for MP-103
tyemirov Nov 21, 2025
7222076
chore: remove band borders for cleaner sections
tyemirov Nov 21, 2025
56cf20b
style: expand full-width color bands
tyemirov Nov 21, 2025
eb18107
style: convert sections into flush bands
tyemirov Nov 21, 2025
3e53df6
style: ensure section bands span full viewport
tyemirov Nov 21, 2025
5df5da5
style: remove spacing between full-width bands
tyemirov Nov 21, 2025
0bf3bcf
feat: introduce mpr-band component for full-width sections
tyemirov Nov 21, 2025
7fd5282
feature: add catalog-driven favicons to product bands (MP-103)
tyemirov Nov 22, 2025
7136bb8
chore: provision icon slots for remaining projects
tyemirov Nov 22, 2025
89773db
feat: add handcrafted SVG favicons for remaining catalog projects
tyemirov Nov 22, 2025
1b8c94c
layout: move Research band below Products
tyemirov Nov 22, 2025
53b9dd7
layout: make band grids left-aligned two-up cards
tyemirov Nov 22, 2025
1fc58ed
layout: enforce two-column grid for bands
tyemirov Nov 22, 2025
d330c04
layout: widen bands and allow up to three cards per row
tyemirov Nov 22, 2025
9f7d522
layout: fix card width and wrap rows
tyemirov Nov 22, 2025
4c9bf67
layout: widen fixed card width to match original feel
tyemirov Nov 22, 2025
1189768
layout: restore centered 2-up grid with original card length
tyemirov Nov 22, 2025
a860b2b
layout: center-wrapped fixed-width cards in bands
tyemirov Nov 22, 2025
d2358e2
layout: lock bands to centered 2-column grid with dynamic card width
tyemirov Nov 22, 2025
dd44374
layout: full-width bands with centered fixed-width cards and wrapping
tyemirov Nov 22, 2025
620a0fe
layout: center full rows and left-align final partial row via band rows
tyemirov Nov 22, 2025
4af5498
style: add horizontal inset for band titles
tyemirov Nov 22, 2025
660e7ca
style: tighten band top padding and increase spacing beneath headings
tyemirov Nov 22, 2025
43d4253
layout: alternate left/right band rows with fixed-width cards
tyemirov Nov 22, 2025
ddb6ee6
layout: add 10px band-row inset and correct maxPerRow to prevent over…
tyemirov Nov 22, 2025
d512b23
style: remove rounded corners from hero media container
tyemirov Nov 22, 2025
60e0460
feat: wrap hero section in band container
tyemirov Nov 22, 2025
26ba0dd
style: force rectangular hero band (section, media, overlay, video)
tyemirov Nov 22, 2025
99f169c
layout: clamp cards to at most two per row and alternate full/partial…
tyemirov Nov 22, 2025
ab7978f
layout: increase band-row horizontal inset to give right-aligned card…
tyemirov Nov 22, 2025
31f6997
Docker image path for ghttp fixed
tyemirov Nov 22, 2025
5e119ac
feat(frontend): add flippable project cards (MP-104)
tyemirov Nov 22, 2025
d144421
Future development
tyemirov Dec 2, 2025
4016a5f
Organize assets and refresh project logos
tyemirov Dec 2, 2025
7ad1144
Align footer palette and add color test
tyemirov Dec 2, 2025
72d6768
Remove footer gap
tyemirov Dec 3, 2025
cd51876
Make footer flush with previous band
tyemirov Dec 3, 2025
fe0621d
Restore Enter/Space navigation on card links
tyemirov Dec 3, 2025
e4cbf2f
Embed LoopAware subscribe widget
tyemirov Dec 3, 2025
865e070
Drive subscribe widget from project data
tyemirov Dec 3, 2025
d2b72d3
Hide subscribe widget fallback and clean tests
tyemirov Dec 3, 2025
c5dbdf0
Show subscribe form on card back
tyemirov Dec 3, 2025
e0014be
Limit subscribe widget to LoopAware
tyemirov Dec 3, 2025
2467641
Render subscribe widget via iframe per card
tyemirov Dec 3, 2025
0b64370
Extend subscribe widget support and tests
tyemirov Dec 3, 2025
1223ca7
Overlay subscribe widgets on flipped cards
tyemirov Dec 3, 2025
dcea4a6
Counter-rotate subscribe overlay to keep widget readable
tyemirov Dec 3, 2025
46baa71
Keep subscribe overlay readable and test flipping
tyemirov Dec 3, 2025
e75e6e2
Add card-back subscribe widget regression test
tyemirov Dec 3, 2025
7770cee
Anchor subscribe widget inside card back
tyemirov Dec 3, 2025
222ee7a
Overlay subscribe widgets without resizing cards
tyemirov Dec 3, 2025
9d51d69
Render subscribe overlay on card back without resizing
tyemirov Dec 3, 2025
bf7cbb6
Stop blurring subscribe widgets and tighten tests
tyemirov Dec 3, 2025
a2e92f6
Re-add front blur and keep subscribe overlay
tyemirov Dec 3, 2025
9ccfbf7
Fix footer drop-up stacking
tyemirov Dec 4, 2025
1a2af75
WIP: subscribe to project news
tyemirov Dec 7, 2025
a5f00ed
Project schema contains various links
tyemirov Dec 10, 2025
60e6e91
maintenance: extend project catalog schema and card actions
tyemirov Dec 10, 2025
11ea1df
feat: add Prompt Bubbles card
tyemirov Dec 10, 2025
5df5328
chore: remove unused public flag from catalog
tyemirov Dec 10, 2025
6c754cb
Improeved definitions of capabilities
tyemirov Dec 10, 2025
d867b7e
Merge branch 'master' into feature/MP-104-flippable-cards
tyemirov Dec 10, 2025
51e8507
fix: enlarge subscribe cards to fit widget
tyemirov Dec 10, 2025
8a03496
merge remote MP-104 updates
tyemirov Dec 10, 2025
1215751
fix: fit subscribe iframe within standard card height
tyemirov Dec 10, 2025
1edbd4a
fix(footer): override CDN position for non-sticky footer (MP-301)
tyemirov Jan 8, 2026
c9713ae
improvement(layout): align band order with MP-103 requirements (MP-203)
tyemirov Jan 8, 2026
a8ccec3
improvement(a11y): toggle iframe tabindex on card flip (MP-204)
tyemirov Jan 8, 2026
efaf07f
Merge pull request #19 from MarcoPoloResearchLab/improvement/MP-204-i…
tyemirov Jan 8, 2026
c36c39e
Merge pull request #18 from MarcoPoloResearchLab/improvement/MP-203-b…
tyemirov Jan 8, 2026
40b3ce2
Merge pull request #17 from MarcoPoloResearchLab/bugfix/MP-301-footer…
tyemirov Jan 8, 2026
0d88bf8
chore(style): remove extra blank line in script.js (MP-410)
tyemirov Jan 8, 2026
1e75788
Merge pull request #20 from MarcoPoloResearchLab/maintenance/MP-410-s…
tyemirov Jan 8, 2026
df7a787
npm dependencies
tyemirov Jan 8, 2026
e0b7f11
Service files ignored
tyemirov Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ docs/TAuth
.env.*
qodana.yaml
bin/
PLAN.md
60 changes: 56 additions & 4 deletions ISSUES.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Each issue is formatted as `- [ ] [<ID>-<number>]`. When resolved it becomes -`
- [x] [MP-100] Replaced the sketch-based hero with the inline hero video (muted by default with an audio toggle) and refreshed the favicon using the provided JPEG source.
- [x] [MP-101] Changed the global theme to dark turquoise with golden typography, updating hero/sections/cards/buttons accordingly.
- [x] [MP-102] Integrated the declarative `<mpr-footer>` from mpr-ui (non-sticky, no theme switch) plus lab-wide quick links.
- [ ] [MP-103] Restructure landing page into four product bands
- [x] [MP-103] Restructure landing page into four product bands

Summary
- Rebuild the entire landing page information architecture (below the hero) around four top-level sections: Research, Tools, Platform, Products.
Expand Down Expand Up @@ -59,16 +59,37 @@ Each issue is formatted as `- [ ] [<ID>-<number>]`. When resolved it becomes -`
- Presence of section headings “Research”, “Tools”, “Platform”, “Products”.
- At least one project card rendered under each of those headings, driven by the JSON catalog.
- Every rendered card shows a name, description, and status badge, and either a working link or an explicit “coming soon” style when configured.
Outcome
- Created `data/projects.json`, rebuilt the four section bands to render cards from the catalog (status-sorted with static visuals), and added Playwright assertions for headings, cards, and link behavior.

- [x] [MP-104] add an ability to visually flip the card and show the back of the card. we will embed a form from LoppAware to subscribe tio the news there later, but I want the cards with BETA and WIP status to flip when clicked on
- Implemented flippable card markup/CSS and JS so Beta and WIP cards toggle an `is-flipped` state on click/keyboard while Production cards remain static, and extended Playwright coverage to assert the behavior.
- [ ] [MP-105] LoopAware-powered feedback widget
- Integrate a LoopAware widget that lets visitors send structured feedback (text + contact details) straight from the landing page footer without jumping to another product surface.
- Current difficulties: the LoopAware embed we ship today is hard-coded for “subscribe” flows (email-only, no free-form message fields), and the script instance assumes each card maps to a LoopAware property, so there is no single endpoint or schema for a global “site feedback” inbox. We need a LoopAware template that supports multi-field submissions plus a consolidated destination before wiring it into the footer drop-up.

## Improvements (200–299)

- [x] [MP-200] Hero text/CTA now lives below the video with refreshed cyberpunk styling so the motion stays unobstructed.
- [x] [MP-201] Swapped in the new hero video (web-optimized MP4) and refreshed fonts (Orbitron + Space Grotesk) to match the cyberpunk aesthetic.
- [ ] [MP-202] LoopAware-powered subscriptions for WIP cards
- On project cards with status WIP, make the WIP badge clickable so the card visually flips as if turned over and reveals a subscribe to updates surface.
- On project cards with status WIP, make the WIP badge clickable so the card visually flips as if turned over and reveals a "subscribe to updates" surface.
- Embed the subscribe form from the LoopAware project (widget or inline form) so visitors can subscribe to news about that specific project without leaving the page.
- Decide whether each project maps to its own LoopAware site identifier or whether all WIP cards share a single lab updates subscription list, and document that mapping.
- Decide whether each project maps to its own LoopAware site identifier or whether all WIP cards share a single "lab updates" subscription list, and document that mapping.
- Extend Playwright coverage to assert that WIP cards expose a working subscription surface and that Production/Beta cards continue to behave as in MP-103.
- [x] [MP-203] Band order in HTML does not match SECTION_ORDER constant in JavaScript — Fixed by reordering `<mpr-band>` elements in `index.html` to match MP-103 canonical order: Research → Tools → Platform → Products.
- `index.html` declares bands in visual order: Tools → Platform → Products → Research
- `script.js:28-33` defines `SECTION_ORDER = ["Research", "Tools", "Platform", "Products"]`
- The mismatch causes no functional bug (cards render correctly because JS iterates bands by `data-band-category` attribute), but it creates maintainability confusion when reasoning about section ordering.
- Fix option A: Reorder `<mpr-band>` elements in `index.html` to match `SECTION_ORDER` (Research → Tools → Platform → Products).
- Fix option B: Reorder `SECTION_ORDER` in `script.js` to match the intended visual order (Tools → Platform → Products → Research).
- Decide which order is canonical per MP-103 requirements ("Research → Tools → Platform → Products") and align both files.
- [x] [MP-204] Subscribe iframe uses `tabindex="-1"`, potentially blocking keyboard-only users from interacting with the LoopAware form — Fixed by toggling iframe tabindex in the `toggleFlip` handler: `tabindex="0"` when flipped, `tabindex="-1"` when unflipped. Added Playwright assertions to verify the behavior.
- Location: `script.js:159` sets `subscribeFrame.setAttribute("tabindex", "-1")`
- Current behavior: The iframe cannot receive focus via Tab navigation, which may prevent keyboard users from entering email or submitting the subscribe form.
- Rationale for current code: Likely added to prevent focus from jumping into the iframe during card flip animation or while card is not flipped.
- Fix: Conditionally set `tabindex="0"` on the iframe when the card enters the flipped state (`is-flipped` class added) and restore `tabindex="-1"` when unflipped. Update the `toggleFlip` handler in `script.js:207-225` to toggle the iframe's tabindex alongside the flip state.
- Extend Playwright test `subscribe-enabled cards render LoopAware forms after flipping` to assert that the iframe is focusable (`tabindex="0"`) when the card is flipped.

## BugFixes (300–399)

Expand All @@ -79,6 +100,14 @@ Each issue is formatted as `- [ ] [<ID>-<number>]`. When resolved it becomes -`
sticky="false"
```

- [x] [MP-301] Footer host element has `position: relative` instead of `position: static`, causing Playwright test `footer respects non-sticky configuration` to fail — Fixed by adding `position: static !important` to override mpr-ui CDN defaults in `styles.css:538`.
- Test location: `tests/hero.spec.js:109`
- Expected: `position: static` on `mpr-footer` host element
- Actual: `position: relative`
- Root cause: The mpr-ui CDN stylesheet likely sets `position: relative` on the `mpr-footer` custom element, and our local `styles.css:536-541` does not explicitly override it to `static`.
- Fix: Add `position: static;` to the `mpr-footer { ... }` rule block in `styles.css` at line 536 to ensure the host element is not positioned, regardless of CDN defaults.
- Verify fix passes: `npx playwright test --grep "footer respects non-sticky"`.

## Maintenance (400–499)

- [x] [MP-400] Added `docker-compose.yml` + `.env.ghttp` to run the site through `ghcr.io/temirov/ghttp` and documented the workflow in README.
Expand All @@ -98,6 +127,29 @@ Each issue is formatted as `- [ ] [<ID>-<number>]`. When resolved it becomes -`
- Final status (WIP, Beta, Production).
- Short, approved description text (one to two sentences, consistent tone).
- Populate @projects.yml to the best of your abilities
- [ ] [MP-404] I am using bands in the design of @index.html. I want to add bands web components to mpr-ui (symlinked under @tools/mpr-ui) and use these components from mpr-ui CDN.
Deliverables:
1. <mpr-band> web component added to mpr-ui. A PR is open in mpr-ui repo
2. <mpr-band> web component provides sufficient cuastimization options using declarative syntax
3. mpr-ui is loaded from the CDN in @index.html
- [x] [MP-405] Consolidated all imagery, videos, and favicons under a canonical `assets/` tree: created `assets/site/` for hero media, fonts, favicons, and brand imagery, standardized project icons as `assets/projects/<project-id>/icon.(svg|png)` while keeping raw files in per-project `brand/` subfolders, and refreshed `index.html`/README references accordingly.
- [x] [MP-406] Rebranded Product Scanner to **Poodle Scanner**, refreshed its description in `data/projects.(json|yml)`, and shipped the ProductScanner repo’s Poodle mark at `assets/projects/product-scanner/icon.png`.
- [x] [MP-407] Normalized every raster project logo to 64×64 (storing the original favicons inside each `brand/` folder), resized the new Poodle icon from the 2048px source, and published `docs/assets-report.md` to document sizes + sources.
- [x] [MP-408] Embedded the LoopAware subscribe widget on the LoopAware project card back face, restyled it to match the lab palette, and wired the flipping logic/tests so beta-style cards can host future LoopAware subscribe mounts.
- [ ] [MP-409] PLAN.md is tracked in git history, violating AGENTS.GIT.md workflow rules
- AGENTS.GIT.md line 47 states: "PLAN.md is intentionally ignored in .gitignore; ensure it never appears in commits."
- Current state: `PLAN.md` was committed in branch `feature/MP-104-flippable-cards` and is visible in `git diff master...HEAD -- PLAN.md`.
- Root cause: `.gitignore` is missing the `PLAN.md` entry.
- Fix steps:
1. Add `PLAN.md` to `.gitignore` (append at end of file).
2. Remove PLAN.md from git tracking: `git rm --cached PLAN.md`.
3. Commit the `.gitignore` update and removal.
4. If PLAN.md must be purged from history (per AGENTS.GIT.md guidance), run: `git filter-repo --path PLAN.md --invert-paths` — but note this rewrites history and is forbidden by AGENTS.GIT.md ("Never use git push --force, git rebase..."). Safer alternative: leave the historical commit as-is and ensure future commits exclude PLAN.md.
- Verify: `git status` should show PLAN.md as untracked after fix.
- [x] [MP-410] Double blank line before DOMContentLoaded listener in script.js — Removed extra blank line at `script.js:476`.
- Location: `script.js:469-470` has two consecutive blank lines before `document.addEventListener("DOMContentLoaded", ...)`.
- AGENTS.FRONTEND.md requires tidy code without dead code or duplicate logic; while not a functional issue, the extra blank line is a style inconsistency.
- Fix: Remove one of the two blank lines at `script.js:469` so only a single blank line separates the `setupHeroAudioToggle` function from the `DOMContentLoaded` listener.

## Planning
## Planning
**Do not work on these, not ready**
5 changes: 1 addition & 4 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: install lint test ci projects-json
.PHONY: install lint test ci

install:
npm install
Expand All @@ -11,6 +11,3 @@ test:

ci:
npm run ci

projects-json:
npx js-yaml data/projects.yml > data/projects.json
5 changes: 5 additions & 0 deletions PLAN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# LoopAware subscribe plan

- Load the hosted LoopAware subscribe widget (`subscribe.js`) so the site can post email submissions against the production service.
- Update flippable cards to host a subscribe mount (starting with LoopAware) and restyle the widget so it blends into the existing beta/alpha back face.
- Wait for the widget to render, move it into the card mount, and extend the Playwright suite to assert the mount exists.
22 changes: 12 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@

Landing page for Marco Polo Research Lab.

The home page features an animated hero section, an about overview and a gallery of our public apps.

This repository hosts the static website built with HTML, CSS and JavaScript. [Three.js](https://threejs.org/) is used to draw and animate the lab's logo and project icons.
The site ships a data-driven hero and project gallery built with semantic HTML, web components from `mpr-ui`, vanilla CSS, and Alpine-powered behaviors in `script.js`. Static assets now live under a consistent `assets/` hierarchy so projects, site chrome, and favicons pull from predictable locations.

You can open `index.html` directly in your browser or serve the site through GitHub Pages.

## Structure

- `index.html` – main page with hero section, about information and a gallery of apps
- `script.js` – initializes Three.js and animates the SVG assets
- `assets/` – fonts and SVG illustrations
- `index.html` – main page with the hero video, CTA, `<mpr-band>` project sections, and the lab footer.
- `script.js` – fetches `data/projects.json`, renders the project cards, and wires up interactive affordances such as the LoopAware-ready flip state.
- `styles.css` – layout, typography, and per-band styling.
- `data/projects.json` – canonical catalog that drives the landing page and tests.
- `assets/` – canonical home for static assets:
- `assets/site/` – hero video, fonts, favicon bundle, and Marco Polo brand imagery
- `assets/projects/<project-id>/icon.(png|svg)` – project card icons plus any extra brand files under `assets/projects/<project-id>/brand/`

## Local Development with Docker Compose

Expand Down Expand Up @@ -50,11 +52,11 @@ Playwright downloads Chromium automatically during `npm install`; the tests load

## Adding a New App

Each entry in the project gallery consists of an SVG logo, a `<canvas>` element and a call to `initProjectAnimation()` in `script.js`. To add a new app:
Each entry in the project gallery is powered by `data/projects.json`:

1. create a new SVG logo in the `assets/` folder
2. add a project card in `index.html` following existing examples
3. reference the SVG from `script.js`
1. create a new `assets/projects/<project-id>/icon.(png|svg)` and keep any supporting references in `assets/projects/<project-id>/brand/`
2. add the project metadata to `data/projects.json`
3. open `index.html` locally or run `npm test` to ensure the Playwright suite exercises the new entry cleanly

Vectorizing images or text to SVG can be done using the tools available in the [svg_tools](https://github.com/tyemirov/svg_tools) repository.

Expand Down
File renamed without changes
File renamed without changes
File renamed without changes
Binary file added assets/projects/ctx/brand/icon-source.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/projects/ctx/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 34 additions & 0 deletions assets/projects/ets/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/projects/ghttp/brand/icon-source.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/projects/ghttp/icon.png
Binary file added assets/projects/gix/brand/icon-source.png
Binary file added assets/projects/gix/icon.png
Binary file added assets/projects/gravity-notes/brand/icon-32.png
Binary file added assets/projects/gravity-notes/icon.png
Binary file added assets/projects/issues-md/brand/icon-source.png
Binary file added assets/projects/issues-md/icon.png
Binary file added assets/projects/ledger/brand/icon-source.png
Binary file added assets/projects/ledger/icon.png
File renamed without changes
30 changes: 30 additions & 0 deletions assets/projects/loopaware/icon.svg
File renamed without changes
27 changes: 27 additions & 0 deletions assets/projects/photolab/icon.svg
Binary file added assets/projects/pinguin/brand/favicon(1).ico
Binary file not shown.
Binary file added assets/projects/pinguin/brand/favicon-16x16.png
Binary file added assets/projects/pinguin/brand/favicon-32x32.png
Loading