Files
aifo-portal-web/agent-handoff-summary.md
steven 4d30803b60 Initial commit: AIFO official portal web.
Add static site, shared layout, and Node dev server with standard .gitignore.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 15:29:50 +08:00

136 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Challenge Floor PC Layout Conversation Summary
## Project & Stack
- **Page:** `e:\AIFO\Project\aifo_web_page\aifo_portal_web\pages\Challenge desktop20260513.html`
- **Render JS:** `e:\AIFO\Project\aifo_web_page\aifo_portal_web\assets\js\challenge-floor-render.js`
- **Stack:** Bootstrap 4, jQuery, no React. Mobile must stay unchanged (`d-none d-lg-block` on metrics col).
## User Goals (PC ≥992px)
1. Left **metrics column** with: Account Size, middle parameter rows (with help icons), One-time Challenge Fee (no help on head/foot).
2. **Strict horizontal alignment** with card content:
- Account Size ↔ `.account-head .size` ($10,000)
- Daily Drawdown, Max Drawdown, Profit Target, etc. ↔ `.values .value-item` rows
- **One-time** (first line of fee label) ↔ `.price-row .price` (e.g. $44.5 / $109)
3. Left column **gradient background** should match **pricing card height** (slightly higher at top only), not stretch full row/parent.
4. **5 cards:** metrics `padding-right: 20px`, `min-width: 223px`; cards **flex-fill** remaining width (not fixed 170px). JS class: `challenge-floor-row--five-cards-pc`.
5. **Profit Target:** keep existing `phase-target-row--1/2/3` + JS row-height sync (unchanged logic).
---
## HTML/JS Structure (desktop)
### `buildFloorHtml()` row classes (`challenge-floor-render.js` ~730758)
- `challenge-floor-row--single-card` (1 card)
- `challenge-floor-row--five-cards-pc` (5 cards)
- `challenge-floor-row--four-cards-pc` (4 cards)
- `challenge-floor-row--instant-aifo-two-pc`, `challenge-floor-row--aifolite-24h-pc` (special layouts)
### Metrics column markup (`renderMetricsColumn`)
```
metrics-col.challenge-ladder
├── metric-item--ladder-head (Account Size + Component 34.svg)
├── metrics-col__body.challenge-ladder__body (middle .metric-item rows + help)
└── challenge-ladder__foot-block
├── metric-item--ladder-foot-split (two-line fee label)
└── challenge-ladder__foot-tail (empty spacer, filled by JS)
```
### `renderMetricsFootItem()` (not generic anchor for foot)
- Line 1: `ladder-foot-row-primary` = icon + `One-time`
- Line 2: `ladder-foot-line--secondary` = `Challenge Fee` with `padding-left: calc(18px + 8px)`
### Desktop cards: `account-card.challenge-ladder` with `challenge-ladder__head`, `values.challenge-ladder__body`, `price-area.challenge-ladder__foot`
---
## CSS Variables (`Challenge desktop20260513.html` :root / .challenge-floor)
- `--challenge-account-head-min-h: 92px`
- `--challenge-values-padding-top: 16px`
- `--challenge-ladder-row-gap: 12px`
- `--challenge-ladder-row-h: 30px`
- `--challenge-metrics-col-pad-left: 20px`
- `--challenge-metrics-col-pad-right: 28px` (28px general; **20px for 5-card row**)
- `--challenge-pc-card-max-w: 280.67px` (24 cards)
- `--challenge-pc-card-max-w-5: 170px` (defined but **5-card layout now uses flex: 1**, not fixed 170)
- `--challenge-best-tag-overhang: 16px` (cards-inner + metrics-col padding-top)
---
## Key PC CSS (`@media (min-width: 992px)`)
### Problematic stretch (causes tall gradient)
```css
#challenge-floor-mount > .row.no-gutters { align-items: stretch; }
.challenge-ladder { height: 100%; }
.metrics-col.challenge-ladder {
align-self: stretch;
background: linear-gradient(...); /* gradient on full column */
padding: var(--challenge-best-tag-overhang) ...;
}
.account-card.challenge-ladder { min-height: 100%; }
```
### Foot label styles
- `.ladder-foot-line { line-height: 30px; }`
- `.ladder-foot-row-primary { min-height: 30px; align-items: center; }`
### 5-card row overrides
- Metrics: `padding-right: 20px`, `min-width: 223px`
- Cards: `flex: 1 1 0%` on columns, scroll `overflow-x: hidden`, inner `width: 100%`
### 9921200px grid
- `display: grid` for multi-card rows; five-cards uses `grid-template-columns: minmax(223px, max-content) minmax(0, 1fr)`
---
## JS: `syncChallengeDesktopLadderHeights()` (PC only, `isCompactChallengeFloorViewport()` returns early)
Resets and syncs:
1. **Head:** `metric-item--ladder-head` padded to align with `.account-head .size`; head bottom matched to `account-head` bottom.
2. **Body start:** `metrics-col__body` `padding-top` measured from card gap (account-head bottom → first value-item).
3. **Middle rows:** pairwise `minHeight`/`height` on `.metrics-col__body .metric-item` and `.value-item`; Profit Target uses `height: auto` + phase min-heights.
4. **Per-row `margin-top`** nudge so each label row top matches first cards value row top.
5. **Foot:** `margin-top` on `$foot` so **`.ladder-foot-line--primary` vertical center** ↔ **`.price` vertical center** (not whole foot block).
6. **foot-tail:** sets height = `card.bottom - foot.bottom`**extends metrics column to full card height including button area** → likely cause of **gradient too tall**.
---
## Resolved Issues
- Restored `price-area` / `price-row` original padding (removed overrides that zeroed `margin-bottom`).
- Middle row alignment via JS + `gap` on body.
- 5-card overlap: switched from fixed narrow width + scroll to flex-fill + metrics min-width.
- Fee label two-line layout + One-time/price alignment.
---
## OPEN TASK (latest user request, NOT implemented)
**Problem:** Left metrics **gradient background** is too tall—almost full parent height—visually much taller than pricing cards.
**User wants:**
1. Gradient must **not** fill entire container.
2. Height ≈ **right pricing card height**, only **slightly higher at top** (design balance).
**Likely fix direction:**
1. Remove or stop using **`foot-tail`** spacer that stretches column to `article.account-card` bottom (includes button + `price-area` padding).
2. Change `metrics-col` from `align-self: stretch` + `height: 100%` to **`align-self: flex-start`**; height = content or JS-set to card height.
3. Move gradient to **`::before`** on `.metrics-col` with height set via CSS variable from JS: `card.outerHeight()` (and optional small top offset), not `foot-tail` fill.
4. Row: `align-items: flex-start` instead of `stretch` if needed.
5. Re-verify alignments after height change (head, body rows, One-time ↔ price).
---
## Files to Edit
- `pages/Challenge desktop20260513.html` PC `@media (min-width: 992px)` metrics-col / challenge-ladder / foot-tail rules
- `assets/js/challenge-floor-render.js` `syncChallengeDesktopLadderHeights()` foot-tail block (~11661178); optionally add `syncMetricsColGradientHeight()`
## Do Not Break
- Mobile (`<992px`) and portrait tablet compact floor (`isCompactChallengeFloorViewport()`).
- `renderMobileAccountCard` / mobile metrics (unchanged).
- Profit Target phase row classes and sync branch.
- Existing business logic (tabs, pricing data, tooltips).
## Testing
- PC: 2 STEP with 5 cards, INSTANT 3 cards (screenshot context), single card, 9921200px width.
- Hard refresh after CSS/JS changes; `syncChallengeDesktopLadderHeights` runs on render + resize (double rAF).