Title
+Content adapts to parent width via container queries.
+diff --git a/RECON.md b/RECON.md new file mode 100644 index 0000000..59ca6b8 --- /dev/null +++ b/RECON.md @@ -0,0 +1,428 @@ +# RECON.md — OpenCD Research Report + +> **Agent:** Face (Templeton Peck) — Recon & Procurement +> **Mission:** Research Open Props, CD physical specs, ASW patterns, trentuna.com aesthetic, CD packaging references +> **Date:** 2026-05-25 +> **Context:** Parent task [t_2c57546a] — DESIGN.md architecture plan calls for this recon before implementation + +--- + +## Q1: Open Props v2 Token Audit + +**Source verified:** `open-props.style` + `github.com/argyleink/open-props` (main branch source files) + +### Import Paths (Current) + +| Method | Code | +|--------|------| +| **CDN (CSS)** | `@import "https://unpkg.com/open-props";` | +| **CDN (HTML link)** | `` | +| **npm** | `npm install open-props` then `@import "open-props/style";` | +| **PostCSS JIT** | `postcss-jit-props` plugin — only ships used props | +| **Design Tokens** | JSON at `https://unpkg.com/open-props/open-props.tokens.json` | + +**Recommendation:** Use `@import "https://unpkg.com/open-props"` for the CDN path (already in DESIGN.md). For npm builds, use `@import "open-props/style"`. + +### Token Values Verified from Source + +#### Sizes (`props.sizes.js`) + +| Token | Value | Used For | +|-------|-------|----------| +| `--size-1` | .25rem | Micro spacing | +| `--size-2` | .5rem | Tight spacing | +| `--size-3` | 1rem | Base spacing | +| `--size-4` | 1.25rem | (gap between OP sizes) | +| `--size-5` | 1.5rem | Regular spacing | +| `--size-7` | 2rem | Large spacing | +| `--size-9` | 4rem | Section spacing | +| `--size-12` | 10rem | Sidebar widths | +| `--size-fluid-1` | clamp(.5rem, 1vw, 1rem) | Responsive padding | +| `--size-fluid-2` | clamp(1rem, 2vw, 1.5rem) | Responsive padding | +| `--size-fluid-3` | clamp(1.5rem, 3vw, 2rem) | Responsive padding | + +#### Font Sizes (`props.fonts.js`) + +| Token | Value | +|-------|-------| +| `--font-size-00` | .5rem | +| `--font-size-0` | .75rem | +| `--font-size-1` | 1rem | +| `--font-size-2` | 1.1rem | +| `--font-size-3` | 1.25rem | +| `--font-size-4` | 1.5rem | +| `--font-size-5` | 2rem | +| `--font-size-6` | 2.5rem | +| `--font-size-7` | 3rem | +| `--font-size-8` | 3.5rem | +| `--font-size-fluid-0` | clamp(.75rem, 2vw, 1rem) | +| `--font-size-fluid-1` | clamp(1rem, 4vw, 1.5rem) | +| `--font-size-fluid-2` | clamp(1.5rem, 6vw, 2.5rem) | +| `--font-size-fluid-3` | clamp(2rem, 9vw, 3.5rem) | + +#### Font Stacks (`props.fonts.js`) + +| Token | Stack | +|-------|-------| +| `--font-system-ui` | system-ui, sans-serif | +| `--font-neo-grotesque` | Inter, Roboto, Helvetica Neue, Arial Nova, Nimbus Sans, Arial, sans-serif | +| `--font-monospace-code` | Dank Mono, Operator Mono, Inconsolata, Fira Mono, ui-monospace, SF Mono, Monaco, Droid Sans Mono, Source Code Pro, Cascadia Code, Menlo, Consolas, DejaVu Sans Mono, monospace | +| `--font-serif` | ui-serif, serif | +| `--font-sans` | var(--font-system-ui) | +| `--font-mono` | var(--font-monospace-code) | + +**Important for OpenCD:** `--font-sans` resolves to `system-ui, sans-serif` — a readable sans. For the CD spine label font, consider `--font-neo-grotesque` (Inter/Roboto) for a cleaner look. + +#### Borders (`props.borders.js`) + +| Token | Value | +|-------|-------| +| `--border-size-1` | 1px | +| `--border-size-2` | 2px | +| `--radius-1` | 2px | +| `--radius-2` | 5px | +| `--radius-3` | 1rem | +| `--radius-round` | 1e5px | + +#### Shadows (`props.shadows.js`) + +| Token | Description | +|-------|-------------| +| `--shadow-1` | Subtle: 0 1px 2px -1px | +| `--shadow-2` | Medium: 3px + 7px layers | +| `--shadow-3` | Raised: composite multi-layer | +| `--shadow-4` | Modal: 5-layer deep shadow | + +#### Colors (19 scales × 13 shades each) + +All verified: `--gray-0` through `--gray-15`, `--red-0` through `--red-12`, `--blue-0` through `--blue-12`, `--green-0` through `--green-12`, `--yellow-0` through `--yellow-12`, plus stone, pink, purple, violet, indigo, cyan, teal, lime, orange, choco, brown, sand, camo, jungle. + +### Critical Findings for the README → DESIGN.md Mapping Table + +| README Claim | Actual Open Props Status | Action Needed | +|-------------|------------------------|---------------| +| `--surface-1` through `--surface-4` | **NOT in Open Props.** These are ASW custom tokens. Open Props provides `--color-1` through `--color-16` (palette-hue driven oklch scale) and individual gray shades. | Use ASW-style semantic aliases or define `--cd-surface-*` directly | +| `--grid-...` | **NOT in Open Props.** No grid-related tokens exist. | Must be custom — use `repeating-linear-gradient` following trentuna.com's pattern | +| `--red-6` / `--red-7` | **Confirmed.** `--red-6` and `--red-7` exist in the red scale. | Good to use as-is | +| `--shadow-2` / `--shadow-3` | **Confirmed.** Exact values verified above. | Good to use | +| `--font-size-fluid-1` through `--font-size-fluid-3` | **Confirmed.** Values verified. | Good | +| `--size-fluid-1` through `--size-fluid-3` | **Confirmed.** Values verified. | Good | +| `--font-sans` | `var(--font-system-ui)` = system-ui, sans-serif | Consider `--font-neo-grotesque` for better label aesthetics | +| `--font-serif` | `ui-serif, serif` | Good for leaflet body | + +### New/Notable Open Props Tokens Since README Was Written + +- **Easings:** `--ease-elastic-*`, `--ease-spring-1..5`, `--ease-bounce-1..5`, Robert Penner equations (`--ease-circ-*`, `--ease-cubic-*`) +- **Animations (21):** `--animation-fade-in/out`, `--animation-slide-*`, `--animation-shake-*`, `--animation-spin`, `--animation-ping`, `--animation-blink`, `--animation-float`, `--animation-bounce`, `--animation-pulse` +- **Aspect ratios:** `--ratio-square`, `--ratio-landscape`, `--ratio-golden`, `--ratio-widescreen` +- **Font line heights:** `--font-lineheight-00` (.95) through `--font-lineheight-5` (2) +- **Letter spacing:** `--font-letterspacing-0` (-.05em) through `--font-letterspacing-7` (1em) +- **Design Tokens export:** JSON, Figma, Style Dictionary formats available via unpkg + +--- + +## Q2: CD Jewel Case Physical Dimensions + +### Standard Dimensions (ISO 15727) + +| Component | Metric | Imperial | Notes | +|-----------|--------|----------|-------| +| **Jewel case (external)** | 142 × 125 × 10 mm | 5.59" × 4.92" × 0.39" | ±0.5mm tolerance | +| **Front insert (visible)** | 120 × 120 mm | 4.724" × 4.724" | With 3mm bleed: 126 × 126 mm canvas | +| **Back insert (tray paper)** | 151 × 118 mm | 5.94" × 4.65" | Includes folded spines on both sides (~15mm each) | +| **CD disc** | Ø 120 mm | Ø 4.724" | Standard CD diameter | +| **CD center hole** | Ø 15 mm | Ø 0.59" | Spindle hole | +| **CD disc thickness** | 1.2 mm | 0.047" | | +| **Spine width (single)** | ~7 mm | ~0.28" | For a single CD jewel case | +| **Jewel case open width** | 284 mm | 11.18" | Two facing panels + spine gap | + +### Web Scaling Analysis + +The README uses **2× scale** (142mm → 280px, 125mm → 245px). At 96 DPI standard web resolution: +- 1mm ≈ 3.78px +- So 142mm × 3.78 ≈ 537px would be exact 1:1 scale +- 2× of 142mm = 284px, which is a **0.53× scale** at 96 DPI +- The rationale: 280×245px is a compact, usable web component size that preserves the aspect ratio + +**Recommendation:** The 2× multiplier is fine for the default scale, but implement `--cd-scale` as a multiplier variable (default: 1 for 2× web scale). This lets users adjust without recalculating every dimension. + +Formula: +```css +--cd-scale: 1; /* 1 = 2× of physical mm → px */ +--cd-jewel-width: calc(142px * var(--cd-scale)); +--cd-jewel-height: calc(125px * var(--cd-scale)); +--cd-disc-diameter: calc(120px * var(--cd-scale)); +--cd-leaflet-size: calc(120px * var(--cd-scale)); +--cd-spine-width: calc(7px * var(--cd-scale)); +``` + +### Region Variations + +| Standard | Body | Notes | +|----------|------|-------| +| ISO 15727:1998 | Global | Original jewel case standard | +| IEC 60908 | Global | CD-DA (Red Book) physical spec | +| Regional | None significant | Jewel case dimensions are globally standardized — CDs fit worldwide | + +No significant regional variations. The 142×125×10mm form factor is universal. + +### Tray Paper & Leaflet Physical Layout + +The back tray paper (151×118mm) folds into three panels: +- **Left spine:** ~7mm (visible from front/back) +- **Center:** 120×118mm (back insert surface) +- **Right spine:** ~7mm + 7mm fold at edge + +The leaflet/booklet is usually: +- **Single sheet:** 240×120mm folded in half → two 120×120mm pages +- **Multi-page:** 480×120mm folded into 4 panels of 120×120mm each +- **Stapled booklet:** 120×120mm pages bound at center fold + +--- + +## Q3: ASW Design Patterns (`~/releases/asw/`) + +### Architecture Overview + +ASW (Agentic Semantic Web) is a zero-class CSS framework built on Open Props. Source verified at `~/releases/asw/src/`. + +**Layer order (11 layers):** + +| # | File | Purpose | +|---|------|---------| +| 00 | `00-reset.css` | Box-sizing, margin reset | +| 01 | `01-tokens.css` | Semantic aliases on Open Props (~300 tokens) | +| 02 | `02-typography.css` | Heading, body, code, table, link styles | +| 03 | `03-landmarks.css` | `body > nav`, `article`, `section`, `footer`, `hgroup`, `dt/dd` | +| 04 | `04-forms.css` | Input, button, select, textarea, validation states | +| 05 | `05-components.css` | Tables, progress, meter, accordion, dialog | +| 06 | `06-navigation.css` | Sub-navigation, sidebar, pagination | +| 07 | `07-data-attrs.css` | Agentic data-* extensions (~15 attributes) | +| 08 | `08-utilities.css` | Container, grid helpers | +| 09 | `09-charts.css` | Chart CSS (Charts.css integration) | +| 10 | `10-chroma.css` | Hugo syntax highlighting theme | +| 11 | `11-layout.css` | Responsive grid layout system | +| 12 | `12-landing.css` | Landing page specific | + +### Key Semantic HTML Patterns + +**Navigation:** +```html +
+ +``` + +**Articles with container queries:** +```html +Content adapts to parent width via container queries.
+