Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
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
d17c894
refactor: rewrite module namespace after owner rename
tyemirov Dec 8, 2025
bbdc1f4
Merge pull request #15 from MarcoPoloResearchLab/automation/ns-rewrit…
tyemirov Dec 8, 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
56 changes: 53 additions & 3 deletions ISSUES.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,34 @@ Each issue is formatted as `- [ ] [<ID>-<number>]`. When resolved it becomes -`
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 @@ -81,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 @@ -100,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.
28 changes: 15 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,23 @@

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

Run the static site behind the [gHTTP](https://github.com/temirov/ghttp) server via Docker Compose:
Run the static site behind the [gHTTP](https://github.com/tyemirov/ghttp) server via Docker Compose:

1. Ensure Docker (with the Compose plugin) is installed locally.
2. Update `.env.ghttp` if you need to change the bind address, exposed port, or container serve path.
Expand All @@ -30,7 +32,7 @@ Run the static site behind the [gHTTP](https://github.com/temirov/ghttp) server

4. Press `Ctrl+C` or run `docker compose --env-file .env.ghttp down` to stop the server.

The Compose stack mounts the repository into the container (`ghcr.io/temirov/ghttp:latest`) read-only, so changes to local files are reflected immediately without rebuilding the image.
The Compose stack mounts the repository into the container (`ghcr.io/tyemirov/ghttp:latest`) read-only, so changes to local files are reflected immediately without rebuilding the image.

## Tooling & Tests

Expand All @@ -50,13 +52,13 @@ 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/temirov/svg_tools) repository.
Vectorizing images or text to SVG can be done using the tools available in the [svg_tools](https://github.com/tyemirov/svg_tools) repository.

## License

Expand Down
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
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.
File renamed without changes
Binary file added assets/projects/ghttp/icon.png
File renamed without changes
Binary file added assets/projects/gix/icon.png
Binary file added assets/projects/gravity-notes/icon.png
Binary file added assets/projects/issues-md/icon.png
Binary file added assets/projects/ledger/icon.png
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
Binary file removed assets/projects/pinguin.png
Diff not rendered.
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