diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..cb5169d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +* text=auto eol=lf + +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.zip binary +*.gz binary diff --git a/.gitignore b/.gitignore index cfe1394..a51ed48 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ next-env.d.ts /.wrangler/ /outputs/ /work/ +/moodlia-sites-*.tar.gz diff --git a/.impeccable/config.json b/.impeccable/config.json new file mode 100644 index 0000000..747d7b3 --- /dev/null +++ b/.impeccable/config.json @@ -0,0 +1,3 @@ +{ + "buildPath": "code" +} diff --git a/.impeccable/critique/2026-08-29T23-33-53Z__app-page-tsx.md b/.impeccable/critique/2026-08-29T23-33-53Z__app-page-tsx.md new file mode 100644 index 0000000..56d3448 --- /dev/null +++ b/.impeccable/critique/2026-08-29T23-33-53Z__app-page-tsx.md @@ -0,0 +1,86 @@ +--- +target: MoodlIA public homepage +total_score: 26 +max_score: 32 +na_heuristics: 7,10 +p0_count: 0 +p1_count: 2 +timestamp: 2026-08-29T23-33-53Z +slug: app-page-tsx +--- +# Design Health Score + +| # | Heuristic | Score | Key issue | +|---|---|---:|---| +| 1 | Visibility of system status | 3/4 | The decorative playhead can resemble a loading indicator. | +| 2 | Match between system and real world | 4/4 | Teaching-first, human, outcome-oriented language. | +| 3 | User control and freedom | 3/4 | Mobile removes primary navigation and direct contact. | +| 4 | Consistency and standards | 4/4 | Highly cohesive editorial system. | +| 5 | Error prevention | 3/4 | Low-risk surface with explicit actions. | +| 6 | Recognition rather than recall | 3/4 | The three routes are clear, but CLI, Core, and Skills need interpretation. | +| 7 | Flexibility and efficiency | n/a | Not applicable to this Persuade surface. | +| 8 | Aesthetic and minimalist design | 3/4 | Authored, focused composition; density and page length keep it from a 4. | +| 9 | Error recognition and recovery | 3/4 | No error-prone workflow; standard links and meaningful alternatives are present. | +| 10 | Help and documentation | n/a | Not applicable as an operational heuristic; contact is assessed as conversion. | +| **Total** | | **26/32** | **Good — 81%** | + +# Design Specificity Verdict + +The homepage is unmistakably authored for MoodlIA. The Helpful Selection system—warm paper, ballpoint rules, three numbered routes, educator photography, and a human-help ending—could not be transferred unchanged to an unrelated SaaS product. + +The CLI detector returned zero findings for `app/page.tsx`. Correct browser inspection at `http://localhost:3000/` confirmed loaded CSS, fonts, and images; no console errors, failed requests, or horizontal overflow at 1440×1000 or 390×844. Eleven overlay warnings from an initial internal workerd port are invalid and were discarded. + +# Overall Impression + +The visual foundation is strong, memorable, and mature. The largest opportunity is not more decoration: it is making the three-way promise easier for a nontechnical visitor to act on, while bringing accessibility and mobile conversion up to the quality of the art direction. + +# What Is Working + +- The desktop first viewport establishes a strong promise, highlighted third line, concise explanation, clear CTA, and distinctive educator collage. +- The three colors, route numbers, ruled lists, photography, and paper material form a disciplined product-specific language without generic cards. +- The copy is humane and evidence-based, and the human-help panel creates a strong ending without fabricated proof. +- Accessibility intent is strong: skip link, landmarks, one H1, visible focus, reduced motion, meaningful alternatives, and equivalent English and Spanish content. + +# Priority Issues + +## [P1] Contrast and touch targets miss the stated accessibility floor + +White CTA text on coral measures 3.47:1; coral and ochre text on cream measure about 3.11–3.12:1, below WCAG AA for normal text. EN and ES measure 40×38 px on desktop and 36×38 px on mobile, below the explicit 44 px target. Darken text-bearing coral and ochre treatments and make both language targets at least 44×44. Suggested command: `$impeccable audit`. + +## [P1] The current static export cannot be published + +`npm run export:static` still asserts the old title “One Moodle. Three ways forward.” while current metadata uses “Make Moodle work for you.” The rendered page is healthy, but this stale delivery gate blocks future publication. Synchronize exporter assertions with current metadata. Suggested command: `$impeccable harden`. + +## [P2] Human help is buried on mobile + +Below 620 px, both header contact and primary navigation disappear. The email route returns only around y=5678 on a roughly 6670 px page. Preserve a compact help route in the mobile hero or header. Suggested command: `$impeccable adapt`. + +## [P2] The homepage reveals technical products too early + +The first route exposes four products plus “See how it helps.” CLI, Moodle Core CLI, and Skills do not reveal teacher/admin fit on their own. Recommend one starting point per route or add concise audience/prerequisite cues, leaving the complete catalog to the route page. Suggested command: `$impeccable distill`. + +## [P2] The design contract is split + +`DESIGN.md` defines The Helpful Selection, while the homepage surface brief still mandates Learning Automata, a crank, and no automatic animation. Update the surface brief and decide whether the playhead clarifies sequence or merely resembles progress. Suggested command: `$impeccable document`. + +# Persona Red Flags + +- **Jordan, first-time visitor:** understands the three needs but cannot confidently classify CLI, Core, and Skills or choose among five local actions. +- **Riley, deliberate stress tester:** immediately finds the brief/implementation contradiction and stale static-export assertion. +- **Casey, distracted mobile visitor:** receives a clear hero, but the distinctive collage barely begins at the bottom of the first viewport and direct help disappears until the end. +- **Educator or Moodle site leader:** sees product names but cannot immediately distinguish self-service teaching tools from administrator-installed or command-line infrastructure. + +# Minor Observations + +- Section-photo hover lift suggests clickability although the figures are not links. +- Some mobile captions fall to about .56rem. +- Three hero images are priority-loaded and repeated later; verify real mobile network cost. +- Unicode arrows are used despite DESIGN.md discouraging glyphs as icon substitutes. +- The page is about 5436 px tall on desktop and 6670 px on mobile, delaying the photographic peak and help on small screens. + +# Questions to Consider + +- If MoodlIA promises three ways, should the homepage also ask a visitor to classify ten projects? +- Is “Find your starting point” the true primary action, or is the three-route rail the more distinctive decision mechanism? +- Should human help remain available in every viewport instead of working mainly as the ending? +- Does the playhead clarify sequence, or does it resemble loading without representing state? diff --git a/.impeccable/design.json b/.impeccable/design.json new file mode 100644 index 0000000..7b9f3b4 --- /dev/null +++ b/.impeccable/design.json @@ -0,0 +1,197 @@ +{ + "schemaVersion": 2, + "generatedAt": "2026-08-19T23:44:51.6804887Z", + "title": "Design System: MoodlIA The Helpful Selection", + "extensions": { + "colorMeta": { + "canvas": { + "role": "neutral", + "displayName": "Warm Canvas", + "canonical": "#f7f2e8", + "tonalRamp": ["oklch(15% 0.014 82)", "oklch(28% 0.016 82)", "oklch(41% 0.018 82)", "oklch(54% 0.02 82)", "oklch(67% 0.018 82)", "oklch(79% 0.015 82)", "oklch(89% 0.011 82)", "oklch(95% 0.008 82)"] + }, + "paper": { + "role": "neutral", + "displayName": "Clean Paper", + "canonical": "#fffdf7", + "tonalRamp": ["oklch(15% 0.009 88)", "oklch(28% 0.011 88)", "oklch(41% 0.013 88)", "oklch(54% 0.014 88)", "oklch(67% 0.013 88)", "oklch(79% 0.011 88)", "oklch(89% 0.008 88)", "oklch(97% 0.005 88)"] + }, + "ink": { + "role": "neutral", + "displayName": "Warm Ink", + "canonical": "#202733", + "tonalRamp": ["oklch(15% 0.018 255)", "oklch(28% 0.022 255)", "oklch(41% 0.025 255)", "oklch(54% 0.026 255)", "oklch(67% 0.022 255)", "oklch(79% 0.016 255)", "oklch(89% 0.01 255)", "oklch(95% 0.006 255)"] + }, + "ink-soft": { + "role": "neutral", + "displayName": "Soft Ink", + "canonical": "#626875", + "tonalRamp": ["oklch(15% 0.014 255)", "oklch(28% 0.018 255)", "oklch(41% 0.021 255)", "oklch(54% 0.022 255)", "oklch(67% 0.019 255)", "oklch(79% 0.014 255)", "oklch(89% 0.009 255)", "oklch(95% 0.005 255)"] + }, + "ballpoint-blue": { + "role": "primary", + "displayName": "Ballpoint Blue", + "canonical": "#315b9a", + "tonalRamp": ["oklch(15% 0.055 257)", "oklch(28% 0.082 257)", "oklch(41% 0.105 257)", "oklch(54% 0.112 257)", "oklch(67% 0.094 257)", "oklch(79% 0.067 257)", "oklch(89% 0.038 257)", "oklch(95% 0.016 257)"] + }, + "deep-blue": { + "role": "primary", + "displayName": "Deep Blue", + "canonical": "#18375f", + "tonalRamp": ["oklch(15% 0.045 256)", "oklch(28% 0.068 256)", "oklch(41% 0.087 256)", "oklch(54% 0.092 256)", "oklch(67% 0.078 256)", "oklch(79% 0.056 256)", "oklch(89% 0.032 256)", "oklch(95% 0.014 256)"] + }, + "active-coral": { + "role": "secondary", + "displayName": "Active Coral", + "canonical": "#e65d4f", + "tonalRamp": ["oklch(15% 0.075 29)", "oklch(28% 0.112 29)", "oklch(41% 0.15 29)", "oklch(54% 0.176 29)", "oklch(67% 0.155 29)", "oklch(79% 0.11 29)", "oklch(89% 0.062 29)", "oklch(95% 0.026 29)"] + }, + "pressed-coral": { + "role": "secondary", + "displayName": "Pressed Coral", + "canonical": "#b73f37", + "tonalRamp": ["oklch(15% 0.07 28)", "oklch(28% 0.105 28)", "oklch(41% 0.14 28)", "oklch(54% 0.158 28)", "oklch(67% 0.137 28)", "oklch(79% 0.098 28)", "oklch(89% 0.055 28)", "oklch(95% 0.023 28)"] + }, + "marker-yellow": { + "role": "tertiary", + "displayName": "Marker Yellow", + "canonical": "#f2c451", + "tonalRamp": ["oklch(15% 0.05 88)", "oklch(28% 0.075 88)", "oklch(41% 0.1 88)", "oklch(54% 0.126 88)", "oklch(67% 0.14 88)", "oklch(79% 0.116 88)", "oklch(89% 0.068 88)", "oklch(95% 0.029 88)"] + }, + "quiet-mint": { + "role": "tertiary", + "displayName": "Quiet Mint", + "canonical": "#a8c7b7", + "tonalRamp": ["oklch(15% 0.022 160)", "oklch(28% 0.033 160)", "oklch(41% 0.044 160)", "oklch(54% 0.052 160)", "oklch(67% 0.05 160)", "oklch(79% 0.041 160)", "oklch(89% 0.026 160)", "oklch(95% 0.012 160)"] + }, + "rule": { + "role": "neutral", + "displayName": "Paper Rule", + "canonical": "#d8d2c6", + "tonalRamp": ["oklch(15% 0.01 78)", "oklch(28% 0.013 78)", "oklch(41% 0.016 78)", "oklch(54% 0.018 78)", "oklch(67% 0.017 78)", "oklch(79% 0.014 78)", "oklch(89% 0.01 78)", "oklch(95% 0.006 78)"] + }, + "focus": { + "role": "tertiary", + "displayName": "Blueprint Focus", + "canonical": "#0d5bd7", + "tonalRamp": ["oklch(15% 0.075 258)", "oklch(28% 0.115 258)", "oklch(41% 0.16 258)", "oklch(54% 0.205 258)", "oklch(67% 0.174 258)", "oklch(79% 0.122 258)", "oklch(89% 0.068 258)", "oklch(95% 0.029 258)"] + } + }, + "typographyMeta": { + "display": { "displayName": "Display", "purpose": "Concise homepage and detail-page hero statements." }, + "headline": { "displayName": "Headline", "purpose": "Major section transitions and help invitations." }, + "title": { "displayName": "Title", "purpose": "Project and tracklist titles." }, + "body": { "displayName": "Body", "purpose": "Bilingual explanation and practical product detail." }, + "label": { "displayName": "Label", "purpose": "Navigation, buttons, sequence numbers, captions, and metadata." } + }, + "shadows": [ + { "name": "paper-mount", "value": "0 1.5rem 4rem rgba(62, 54, 43, .13), 0 .2rem .7rem rgba(62, 54, 43, .1)", "purpose": "Canonical close shadow for mounted educator photography." }, + { "name": "paper-hover", "value": "0 2.2rem 5rem rgba(62, 54, 43, .18)", "purpose": "Deeper hover lift for large route photographs." }, + { "name": "coral-action", "value": "0 .7rem 1.5rem rgba(183, 63, 55, .24)", "purpose": "Compact colored depth for the primary action." } + ], + "motion": [ + { "name": "ease-out", "value": "cubic-bezier(.22, 1, .36, 1)", "purpose": "Paper entrances, arrows, and small hover transforms." }, + { "name": "hero-photo-entry", "value": "900ms with 50ms, 160ms, and 270ms delays", "purpose": "One three-beat entrance for the overlapping homepage photographs." }, + { "name": "sequence-playhead", "value": "5000ms after a 1000ms delay", "purpose": "One traversal of the three-track route rail after load." }, + { "name": "page-sheet-replacement", "value": "140ms exit and 320ms entrance", "purpose": "Keeps the header stable while one editorial paper page replaces another, using native View Transitions with a static-site fallback." }, + { "name": "reduced-motion", "value": "0.01ms", "purpose": "Effectively disables animation and transition while preserving final state." } + ], + "breakpoints": [ + { "name": "compact-header", "value": "1000px" }, + { "name": "stacked-layout", "value": "820px" }, + { "name": "mobile", "value": "620px" } + ] + }, + "components": [ + { + "name": "Primary Action", + "kind": "button", + "refersTo": "primary-action", + "description": "The coral action used for the clearest next step.", + "html": "Find your way", + "css": ".ds-primary-action { min-height: 48px; padding: .8rem 1.2rem; display: inline-flex; align-items: center; justify-content: center; border-radius: .35rem; background: var(--coral, #e65d4f); color: #fff; box-shadow: 0 .7rem 1.5rem rgba(183,63,55,.24); font: 800 .82rem/1.2 var(--font-body, 'DM Sans', Arial, sans-serif); text-decoration: none; transition: background .2s ease, box-shadow .2s ease, transform .2s cubic-bezier(.22,1,.36,1); } .ds-primary-action:hover { background: var(--coral-dark, #b73f37); box-shadow: 0 .42rem 1rem rgba(133,49,44,.22); transform: translateY(1px); } .ds-primary-action:focus-visible { outline: 3px solid var(--focus, #0d5bd7); outline-offset: 4px; } .ds-primary-action:active { background: #85312c; }" + }, + { + "name": "Underlined Text Action", + "kind": "button", + "refersTo": "text-action", + "description": "The quieter blue action for help and secondary navigation.", + "html": "Ask us anything", + "css": ".ds-text-action { min-height: 48px; display: inline-flex; align-items: center; border-bottom: 2px solid currentColor; color: var(--blue, #315b9a); font: 800 .82rem/1.2 var(--font-body, 'DM Sans', Arial, sans-serif); text-decoration: none; } .ds-text-action:hover { color: var(--blue-dark, #18375f); } .ds-text-action:focus-visible { outline: 3px solid var(--focus, #0d5bd7); outline-offset: 4px; } .ds-text-action:active { color: var(--blue-dark, #18375f); }" + }, + { + "name": "Site Navigation", + "kind": "nav", + "description": "The quiet header navigation with an authored coral hover underline.", + "html": "", + "css": ".ds-site-nav { display: flex; align-items: center; gap: 1.8rem; font-family: var(--font-body, 'DM Sans', Arial, sans-serif); } .ds-site-nav a { position: relative; min-height: 44px; display: inline-flex; align-items: center; color: var(--ink, #202733); font-size: .82rem; font-weight: 720; text-decoration: none; } .ds-site-nav a::after { content: ''; position: absolute; right: 0; bottom: .45rem; left: 0; height: 2px; background: var(--coral, #e65d4f); transform: scaleX(0); transform-origin: left; transition: transform .25s cubic-bezier(.22,1,.36,1); } .ds-site-nav a:hover::after { transform: scaleX(1); } .ds-site-nav a:focus-visible { outline: 3px solid var(--focus, #0d5bd7); outline-offset: 4px; }" + }, + { + "name": "Language Switcher", + "kind": "custom", + "description": "A compact bilingual control whose filled segment identifies the current language.", + "html": "
ENES
", + "css": ".ds-language { display: inline-flex; overflow: hidden; border: 1px solid rgba(32,39,51,.25); border-radius: .35rem; font-family: var(--font-body, 'DM Sans', Arial, sans-serif); } .ds-language a { min-width: 40px; min-height: 38px; display: grid; place-items: center; color: var(--ink-soft, #626875); font-size: .68rem; font-weight: 800; text-decoration: none; } .ds-language .ds-language-current { background: var(--ink, #202733); color: var(--paper, #fffdf7); } .ds-language a:hover { color: var(--blue, #315b9a); } .ds-language a:focus-visible { outline: 3px solid var(--focus, #0d5bd7); outline-offset: -3px; }" + }, + { + "name": "Mounted Educator Photograph", + "kind": "card", + "description": "A captioned 4:5 educator photograph mounted on paper over a softly rotated route-color backing.", + "html": "
\"An
AI that supports the way you already teach
01
", + "css": ".ds-photo { position: relative; width: min(100%,320px); margin: 1.5rem; padding: .55rem .55rem 2.7rem; background: var(--paper, #fffdf7); box-shadow: 0 1.5rem 4rem rgba(62,54,43,.13), 0 .2rem .7rem rgba(62,54,43,.1); transform: rotate(-2deg); } .ds-photo::before { content: ''; position: absolute; z-index: -1; inset: 4% -3% -3% 4%; border-radius: .65rem; background: var(--mint, #a8c7b7); transform: rotate(-2.3deg); } .ds-photo img { width: 100%; aspect-ratio: 4/5; display: block; object-fit: cover; } .ds-photo figcaption { position: absolute; right: 2.5rem; bottom: .85rem; left: .8rem; overflow: hidden; color: var(--ink-soft, #626875); font: 720 .66rem/1.2 var(--font-body, 'DM Sans', Arial, sans-serif); text-overflow: ellipsis; white-space: nowrap; } .ds-photo>span { position: absolute; right: .7rem; bottom: .62rem; width: 1.55rem; height: 1.55rem; display: grid; place-items: center; border-radius: 50%; background: var(--blue, #315b9a); color: #fff; font: 850 .56rem/1 var(--font-body, 'DM Sans', Arial, sans-serif); }" + }, + { + "name": "Three-Track Rail", + "kind": "nav", + "description": "The numbered route selector that explains the ecosystem and navigates to each selection.", + "html": "", + "css": ".ds-track-rail { display: grid; grid-template-columns: repeat(3,1fr); border-top: 2px solid var(--ink, #202733); border-bottom: 1px solid var(--rule, #d8d2c6); font-family: var(--font-body, 'DM Sans', Arial, sans-serif); } .ds-track-rail a { min-height: 106px; padding: 1.35rem 1.5rem; display: grid; grid-template-columns: auto 1fr; align-items: center; gap: 1rem; border-right: 1px solid var(--rule, #d8d2c6); color: var(--ink, #202733); text-decoration: none; } .ds-track-rail a:last-child { border-right: 0; } .ds-track-rail span { width: 2.2rem; height: 2.2rem; display: grid; place-items: center; border: 2px solid currentColor; border-radius: 50%; color: var(--blue, #315b9a); font-size: .64rem; font-weight: 850; } .ds-track-rail a:nth-child(2) span { color: var(--coral, #e65d4f); } .ds-track-rail a:nth-child(3) span { color: #8a6500; } .ds-track-rail strong { font-family: var(--font-display, 'Bricolage Grotesque', Arial, sans-serif); font-size: 1.15rem; line-height: 1.1; } .ds-track-rail a:hover { background: rgba(49,91,154,.09); } .ds-track-rail a:focus-visible { outline: 3px solid var(--focus, #0d5bd7); outline-offset: -3px; }" + }, + { + "name": "Direct Help Panel", + "kind": "custom", + "refersTo": "help-panel", + "description": "The high-contrast human support invitation that closes home and detail pages.", + "html": "
3

We can help you put it together.

Tell us what is getting in the way.

contact@moodlia.com
", + "css": ".ds-help { position: relative; padding: 3rem; display: grid; grid-template-columns: .45fr 1fr; align-items: center; gap: 2rem; overflow: hidden; border-radius: 1.2rem; background: var(--blue-dark, #18375f); color: var(--paper, #fffdf7); font-family: var(--font-body, 'DM Sans', Arial, sans-serif); } .ds-help::before { content: ''; position: absolute; inset: 1.1rem; border: 1px solid rgba(255,255,255,.22); border-radius: .75rem; pointer-events: none; } .ds-help>strong { position: relative; color: var(--yellow, #f2c451); font: 760 9rem/.65 var(--font-display, 'Bricolage Grotesque', Arial, sans-serif); transform: rotate(-6deg); } .ds-help h2 { position: relative; margin: 0; font: 720 3rem/.95 var(--font-display, 'Bricolage Grotesque', Arial, sans-serif); letter-spacing: -.04em; } .ds-help p { position: relative; color: rgba(255,255,255,.72); } .ds-help a { position: relative; min-height: 48px; display: inline-flex; align-items: center; border-bottom: 2px solid var(--yellow, #f2c451); color: var(--yellow, #f2c451); font-weight: 800; text-decoration: none; } .ds-help a:focus-visible { outline: 3px solid var(--focus, #0d5bd7); outline-offset: 4px; }" + } + ], + "narrative": { + "northStar": "The Helpful Selection", + "overview": "MoodlIA should feel like a concise selection assembled by an experienced educator: personal, useful, and ready for the teaching moment at hand. Warm ruled paper, ballpoint-blue structure, colored track markers, short handwritten-style annotations, and layered photographs create the care of a prepared editorial insert without drawing a literal cassette or leaning on nostalgia.\n\nThe interface is education-first and deliberately nontechnical. People and teaching decisions lead; product mechanics appear only after a visitor chooses a way forward. The homepage's three overlapping educator photographs and three-track rail make the ecosystem memorable, while way and product pages reuse the same paper, sequencing, and direct-help language without repeating the whole composition.", + "keyCharacteristics": [ + "Warm cream paper with quiet blue ruled lines.", + "Three numbered routes with stable blue, coral, and yellow accents.", + "Real educator photography mounted as overlapping paper prints.", + "Large authored display type paired with compact, readable sans-serif copy.", + "Ruled lists, captions, tabs, and modest rotations instead of generic card grids.", + "Direct human help throughout; GitHub appears only as a product-page action." + ], + "rules": [ + { "name": "The Three-Track Rule", "body": "AI integration is blue, teaching tools are coral, and learning insights are yellow with dark ink. Number, label, and position must repeat the distinction so color never carries meaning alone.", "section": "colors" }, + { "name": "The Paper Leads Rule", "body": "Accent colors identify routes and actions; they do not replace the warm paper field as the dominant surface.", "section": "colors" }, + { "name": "The Two-Voice Rule", "body": "Bricolage Grotesque declares; DM Sans explains and enables action. Do not introduce another display or decorative typeface.", "section": "typography" }, + { "name": "The Short Statement Rule", "body": "Large type earns its scale through concise copy. Long technical explanations belong below the hero and on product pages.", "section": "typography" }, + { "name": "The Sequence Survives Rule", "body": "Responsive layouts may stack, but route numbers, ruled continuity, captions, and the order one–two–three remain visible.", "section": "layout" }, + { "name": "The Paper Contact Rule", "body": "Shadows describe one sheet or photograph resting above another. Do not use ambient elevation to make ordinary paragraphs look like application cards.", "section": "elevation" }, + { "name": "The Useful Shape Rule", "body": "A circle marks sequence or action; a line connects or separates; a rotated rectangle reads as paper. Do not add geometry without one of those jobs.", "section": "shapes" } + ], + "dos": [ + "Do lead with real educators, teaching moments, and clear outcomes before implementation detail.", + "Do preserve the three numbered routes and their blue, coral, and yellow assignments.", + "Do use ruled paper, captions, modest rotation, and close shadows as one coherent editorial material vocabulary.", + "Do keep English and Spanish structurally equivalent, concise, and page-preserving.", + "Do make direct help visible and keep GitHub actions on individual product pages only.", + "Do retain the skip link, visible focus, 44px targets, meaningful alternative text, reduced motion, and forced-colors fallbacks." + ], + "donts": [ + "Don't turn the experience into a generic SaaS hero, rounded feature-card grid, or technical dashboard aesthetic.", + "Don't use robots, holograms, dark technology imagery, abstract AI symbols, or fabricated product screenshots in place of human education photography.", + "Don't add gradients that imply technology, glassmorphism, neon, or unrelated accent colors.", + "Don't use Unicode glyphs as a substitute for authored or library icons.", + "Don't expose GitHub in global navigation, way pages, or the homepage.", + "Don't add testimonials, logos, metrics, or claims without approved evidence.", + "Don't canonize the legacy kraft-board, brass-pin, stencil-type, or hand-crank “Learning Automata” vocabulary; it is not present in the shipped interface." + ] + } +} diff --git a/.impeccable/direction-options-modern-education-bolder.json b/.impeccable/direction-options-modern-education-bolder.json new file mode 100644 index 0000000..7c63aec --- /dev/null +++ b/.impeccable/direction-options-modern-education-bolder.json @@ -0,0 +1,117 @@ +{ + "title": "Una dirección más valiente para MoodlIA", + "question": "Seis mundos visuales poco convencionales, todos centrados en hacer que enseñar resulte más fácil. Elige el que mejor debería representar a MoodlIA.", + "options": [ + { + "id": "challenger-ribbon", + "label": "El hilo que ayuda", + "kicker": "LA NUEVA PROPUESTA", + "verdict": "assigned", + "lineage": "Una cinta continua de aprendizaje que conecta cada necesidad con una solución", + "thesis": "MoodlIA se cuenta como un recorrido humano: aparece una dificultad, la ayuda la atraviesa y el resultado queda visible.", + "palette": ["#FFF8E9", "#EF4A3C", "#24495B", "#88B79B"], + "materials": ["una cinta ilustrada", "fotografía educativa cálida", "grandes hitos narrativos"], + "viewport": "Una cinta roja entra por la portada, rodea una escena real de aprendizaje y se divide en tres recorridos claros antes de reunirse en una invitación a pedir ayuda.", + "case": "Es la idea más propia de MoodlIA: explica que todos los productos forman una ayuda continua sin parecer una plataforma técnica.", + "risk": "La metáfora necesita una composición muy precisa para que la cinta guíe y no se convierta en simple decoración.", + "comp": ".impeccable/mocks/decision/helping-thread.webp", + "hero": "https://impeccable.style/worlds/cards/exhibition-museum-curation-provenance-ribbon-hero.webp", + "board": "https://impeccable.style/worlds/cards/exhibition-museum-curation-provenance-ribbon.webp" + }, + { + "id": "challenger-comic", + "label": "La aventura de enseñar", + "kicker": "LA ALTERNATIVA MÁS FUERTE", + "verdict": "competitive", + "lineage": "Álbum ilustrado de línea clara convertido en una historia educativa contemporánea", + "thesis": "Cada producto es un capítulo breve donde una persona encuentra una forma más sencilla de enseñar, corregir o comprender.", + "palette": ["#FFFDF3", "#112D42", "#57A9D8", "#F15A4A", "#F3C94C"], + "materials": ["ilustración de línea clara", "colores planos", "escenas humanas en viñetas"], + "viewport": "Una gran escena de aula abre la portada; al desplazarse, tres capítulos visuales muestran la dificultad, la ayuda y el alivio sin jerga.", + "case": "Supera a la cinta en identificación inmediata y empatía; además permite explicar productos distintos con muy poco texto.", + "risk": "Debe sentirse editorial y adulto, no infantil ni como una web de entretenimiento.", + "comp": ".impeccable/mocks/decision/teaching-adventure.webp", + "hero": "https://impeccable.style/worlds/cards/pop-culture-shelf-ligne-claire-album-hero.webp", + "board": "https://impeccable.style/worlds/cards/pop-culture-shelf-ligne-claire-album.webp" + }, + { + "id": "challenger-weave", + "label": "Ideas que se entrelazan", + "verdict": "competitive", + "lineage": "Un telar Jacquard donde pequeñas ayudas forman una imagen educativa completa", + "thesis": "MoodlIA convierte muchas tareas dispersas en un tejido coherente que acompaña el trabajo diario.", + "palette": ["#10283D", "#F1C75B", "#FFF4D8", "#E85A4F"], + "materials": ["tramas tejidas", "detalles dorados", "patrones que se completan al explorar"], + "viewport": "Tres bandas de color se entrelazan lentamente y revelan una gran imagen central sobre aprender con menos esfuerzo.", + "case": "Es visualmente excepcional y representa bien un ecosistema de productos conectados, aunque necesita más interpretación que la aventura ilustrada.", + "risk": "La referencia al telar puede sentirse artesanal o compleja si las instrucciones perforadas ganan protagonismo.", + "comp": ".impeccable/mocks/decision/interwoven-ideas.webp", + "hero": "https://impeccable.style/worlds/cards/textiles-weave-drape-fashion-jacquard-punched-brocade-hero.webp", + "board": "https://impeccable.style/worlds/cards/textiles-weave-drape-fashion-jacquard-punched-brocade.webp" + }, + { + "id": "challenger-rhythm", + "label": "Tu ritmo de enseñar", + "verdict": "competitive", + "lineage": "Una secuencia de pasos vivos donde cada acción hace avanzar el día", + "thesis": "MoodlIA no impone una forma de trabajar: se adapta al ritmo de cada docente y deja que active solo la ayuda que necesita.", + "palette": ["#262B32", "#F05A4F", "#F29D49", "#F2D45C", "#F7F3E9"], + "materials": ["franjas de pasos", "pulsos de color", "microinteracciones táctiles"], + "viewport": "Una secuencia de tres grandes pasos se activa con el desplazamiento: preparar, acompañar y comprender; cada uno abre sus productos con una respuesta inmediata.", + "case": "Tiene la experiencia más dinámica y hace tangible la idea de avanzar, pero el origen musical requiere una traducción educativa muy cuidada.", + "risk": "Una estética demasiado oscura o instrumental haría que MoodlIA volviera a parecer un producto técnico.", + "comp": ".impeccable/mocks/decision/teaching-rhythm.webp", + "hero": "https://impeccable.style/worlds/cards/signals-instruments-drum-machine-step-row-hero.webp", + "board": "https://impeccable.style/worlds/cards/signals-instruments-drum-machine-step-row.webp" + }, + { + "id": "challenger-mixtape", + "label": "La selección que acompaña", + "verdict": "competitive", + "lineage": "Una recopilación personal, organizada para cada momento de la enseñanza", + "thesis": "Como una selección hecha con cuidado, MoodlIA reúne la ayuda adecuada para planificar, evaluar y entender lo que ocurre.", + "palette": ["#FFFDF7", "#2357A6", "#EF564D", "#F1C34D", "#242424"], + "materials": ["anotaciones humanas", "grandes etiquetas", "una composición plegable"], + "viewport": "La portada parece una selección personal preparada para el visitante; al abrirse, aparecen tres lados visuales con productos y resultados concretos.", + "case": "Es cálida, cercana y memorable, pero su nostalgia puede competir con la sensación de futuro que necesita la marca.", + "risk": "Debe evitar cualquier copia literal del casete y conservar solo su carácter personal y cuidadosamente seleccionado.", + "comp": ".impeccable/mocks/decision/learning-selection.webp", + "hero": "https://impeccable.style/worlds/cards/vernacular-ephemera-cassette-j-card-hero.webp", + "board": "https://impeccable.style/worlds/cards/vernacular-ephemera-cassette-j-card.webp" + }, + { + "id": "challenger-jackfield", + "label": "El mapa de conexiones", + "verdict": "declined", + "lineage": "Líneas que muestran de forma honesta qué ayuda está conectada a cada necesidad", + "thesis": "Nada se oculta: cada producto mantiene visible a quién ayuda y qué cambia.", + "palette": ["#111417", "#F0A33A", "#FFF7E8"], + "materials": ["líneas de conexión", "carriles numerados", "estados dibujados"], + "viewport": "Tres conexiones atraviesan una superficie oscura y llevan de cada necesidad a un resultado.", + "case": "La claridad del sistema es útil, pero su lenguaje visual sigue siendo demasiado técnico para la promesa de MoodlIA.", + "kept": "Cada producto debe dejar claro qué necesidad atiende y cuál es el siguiente paso.", + "risk": "La superficie negra y los carriles recuerdan a infraestructura y configuración.", + "comp": ".impeccable/mocks/decision/connection-map.webp", + "hero": "https://impeccable.style/worlds/cards/operate-b-normalled-jackfield-hero.webp", + "board": "https://impeccable.style/worlds/cards/operate-b-normalled-jackfield.webp" + } + ], + "reroll": { + "registers": ["safer", "bolder"] + }, + "buildPath": { + "value": "code", + "toggle": true + }, + "canon": true, + "canonCard": { + "label": "Una plataforma educativa moderna", + "thesis": "Una portada clara con fotografía de aula, beneficios directos y tres accesos ordenados.", + "palette": ["#FFFFFF", "#17324D", "#2F6FED", "#F3F7FB"], + "materials": ["retícula limpia", "fotografía educativa", "tarjetas suaves"], + "viewport": "Una promesa principal, una fotografía cercana y tres rutas de producto convencionales.", + "risk": "Funciona, pero se confundiría con muchas otras webs educativas.", + "comp": ".impeccable/mocks/decision/canon-education-bolder.webp" + }, + "steer": true +} diff --git a/.impeccable/direction-options-modern-education.json b/.impeccable/direction-options-modern-education.json new file mode 100644 index 0000000..c3e09b3 --- /dev/null +++ b/.impeccable/direction-options-modern-education.json @@ -0,0 +1,156 @@ +{ + "title": "Choose MoodlIA's new visual world", + "question": "The current paper machine is gone. Choose the modern educational world that should replace it.", + "options": [ + { + "id": "assigned", + "label": "The Learning Commons", + "kicker": "THE NEW DIRECTION", + "lineage": "Contemporary public libraries, university learning commons, and cultural wayfinding", + "thesis": "MoodlIA becomes a bright place where every educator immediately finds an easier way forward.", + "palette": ["#F7F5EE", "#17324D", "#E85D4A", "#79A86B", "#F1C75B"], + "materials": ["daylight photography", "editorial typography", "large wayfinding bands"], + "viewport": "A generous learning-space photograph carries one plain promise while three coloured routes open directly inside the scene.", + "risk": "It needs excellent photography and disciplined typography to avoid feeling like a generic university website.", + "raised": [ + { + "from": "Sequential learning stories", + "raise": "The scroll now changes pace deliberately, with one memorable reveal instead of a uniform stack of sections." + }, + { + "from": "Transparent guide", + "raise": "Every route keeps a visible colour and label across navigation, detail pages, and mobile." + }, + { + "from": "Living ink", + "raise": "Motion feels calm and responsive, following the visitor rather than performing at them." + } + ], + "comp": ".impeccable/mocks/decision/learning-commons.webp" + }, + { + "id": "model-pick", + "label": "The Living Workbook", + "kicker": "IMPECCABLE’S PICK", + "lineage": "The best contemporary school workbooks and independent education magazines", + "thesis": "MoodlIA feels like the beautifully edited guide a teacher actually keeps open beside Moodle.", + "palette": ["#FFFDF7", "#1E3A5F", "#FF6B57", "#A8D7C2", "#FFD66B"], + "materials": ["bold editorial spreads", "real classroom photography", "useful annotations"], + "viewport": "A strong magazine cover composition pairs a human classroom moment with one large sentence and three clear chapter markers.", + "risk": "Editorial education is familiar territory, so it must be composed with unusual confidence to remain distinctive.", + "comp": ".impeccable/mocks/decision/living-workbook.webp" + }, + { + "id": "challenger-manga", + "label": "Sequential Learning Stories", + "verdict": "competitive", + "lineage": "Weekly manga pacing translated into educational storytelling", + "thesis": "Each MoodlIA path unfolds as a short visual story in which the educator is always the protagonist.", + "palette": ["#FFFEF8", "#161616", "#EF5B47"], + "materials": ["high-contrast panels", "expressive crops", "decisive page turns"], + "viewport": "Three asymmetrical scenes show the problem, the easier action, and the calmer outcome without technical explanation.", + "case": "Excellent narrative clarity and a radical identity, but some educators may read the manga grammar as entertainment before support.", + "risk": "The visual language can overpower trust if illustration quality or restraint slips.", + "comp": ".impeccable/mocks/decision/sequential-learning.webp", + "hero": "https://impeccable.style/worlds/cards/pop-culture-shelf-manga-screentone-page-hero.webp", + "board": "https://impeccable.style/worlds/cards/pop-culture-shelf-manga-screentone-page.webp" + }, + { + "id": "challenger-manual", + "label": "The Transparent Guide", + "verdict": "competitive", + "lineage": "Tabbed reference guides rebuilt as a friendly education service", + "thesis": "Information appears only when it helps, layered over a simple route that never loses the visitor.", + "palette": ["#FFF9ED", "#164E63", "#F59E5B", "#78B7A4", "#B7A6D9"], + "materials": ["translucent colour fields", "oversized tabs", "quiet reading pages"], + "viewport": "One welcoming sentence sits beside three broad tabs whose translucent layers preview what each route makes easier.", + "case": "It has the strongest information architecture, but its reference-manual origin risks feeling technical if the copy becomes procedural.", + "risk": "Too many layers would recreate the complexity MoodlIA promises to remove.", + "comp": ".impeccable/mocks/decision/transparent-guide.webp", + "hero": "https://impeccable.style/worlds/cards/rw-manual-acetate-tab-board-hero.webp", + "board": "https://impeccable.style/worlds/cards/rw-manual-acetate-tab-board.webp" + }, + { + "id": "challenger-ink", + "label": "Living Ink", + "verdict": "declined", + "lineage": "Suminagashi marbling as a calm responsive learning surface", + "thesis": "Three gentle currents join around each educator's intention and make the next step visible.", + "palette": ["#FCFBF5", "#244A63", "#6DAA9A", "#E77A62"], + "materials": ["fluid colour", "quiet margins", "organic movement"], + "viewport": "A calm white field lets three coloured currents gather around one human promise.", + "case": "Emotionally warm but too abstract to explain a family of real products quickly.", + "kept": "Motion should respond gently to the visitor instead of playing automatically.", + "risk": "The fluid effect can become decoration rather than useful guidance.", + "comp": ".impeccable/mocks/decision/living-ink.webp", + "hero": "https://impeccable.style/worlds/cards/medium-native-fluid-ink-basin-hero.webp", + "board": "https://impeccable.style/worlds/cards/medium-native-fluid-ink-basin.webp" + }, + { + "id": "challenger-calendar", + "label": "The Learning Shelf", + "verdict": "declined", + "lineage": "Seasonal classroom collections and visible learning progress", + "thesis": "MoodlIA's projects become useful resources arranged by the moment a teacher needs them.", + "palette": ["#FFF8E8", "#355E4B", "#D95D52", "#E7B854"], + "materials": ["labelled collections", "seasonal colour", "visible progression"], + "viewport": "A bright teaching shelf groups the three routes as resources ready for today's need.", + "case": "The sense of useful progression is strong, but the storage metaphor is too literal for digital services.", + "kept": "Show progress and outcomes as visible states, not abstract claims.", + "risk": "It could become quaint instead of modern.", + "comp": ".impeccable/mocks/decision/learning-shelf.webp", + "hero": "https://impeccable.style/worlds/cards/food-fermentation-culinary-theater-pickling-brine-calendar-hero.webp", + "board": "https://impeccable.style/worlds/cards/food-fermentation-culinary-theater-pickling-brine-calendar.webp" + }, + { + "id": "challenger-light", + "label": "Paths of Light", + "verdict": "declined", + "lineage": "Bioluminescent trails translated into immediate guidance", + "thesis": "Every choice lights only the next useful step and lets everything else stay quiet.", + "palette": ["#102F3A", "#68D9D0", "#F7D36A", "#F7FBF7"], + "materials": ["luminous trails", "deep quiet fields", "responsive traces"], + "viewport": "Three light paths answer the visitor's pointer and converge on a simple invitation to begin.", + "case": "Memorable interaction, but the dark digital atmosphere contradicts the requested educational warmth.", + "kept": "Interaction should reveal relationships immediately and then recede.", + "risk": "It reads as technology before it reads as help.", + "comp": ".impeccable/mocks/decision/paths-of-light.webp", + "hero": "https://impeccable.style/worlds/cards/reefs-bioluminescent-nocturnal-plankton-wake-stars-hero.webp", + "board": "https://impeccable.style/worlds/cards/reefs-bioluminescent-nocturnal-plankton-wake-stars.webp" + }, + { + "id": "challenger-detector", + "label": "Learning Orbit", + "verdict": "declined", + "lineage": "Concentric event displays translated into three connected services", + "thesis": "Every MoodlIA product orbits one clear centre: helping people teach more easily.", + "palette": ["#F7F5EE", "#183A4A", "#F2C14E", "#5AA9A1"], + "materials": ["concentric maps", "precise paths", "focused selection"], + "viewport": "Three routes circle one human goal and expand into products when selected.", + "case": "The relationship is clear, but the scientific display is exactly the technical signal the redesign must leave behind.", + "kept": "Keep one visible centre so the ecosystem never feels fragmented.", + "risk": "Even softened, it still looks analytical and specialist.", + "comp": ".impeccable/mocks/decision/learning-orbit.webp", + "hero": "https://impeccable.style/worlds/cards/scientific-notation-particle-detector-event-display-hero.webp", + "board": "https://impeccable.style/worlds/cards/scientific-notation-particle-detector-event-display.webp" + } + ], + "reroll": { + "registers": ["safer", "bolder"] + }, + "buildPath": { + "value": "code", + "toggle": true + }, + "canon": true, + "canonCard": { + "label": "The polished education standard", + "thesis": "A clean modern education landing page with campus photography and familiar product navigation.", + "palette": ["#FFFFFF", "#17324D", "#2F6FED", "#F3F7FB"], + "materials": ["clean grid", "campus photography", "soft interface surfaces"], + "viewport": "A conventional benefit-led hero, one education photograph, and three equal routes below it.", + "risk": "Easy to understand, but intentionally indistinguishable from many education platforms.", + "comp": ".impeccable/mocks/decision/canon-education.webp" + }, + "steer": true +} diff --git a/.impeccable/direction-options.json b/.impeccable/direction-options.json new file mode 100644 index 0000000..390a9b2 --- /dev/null +++ b/.impeccable/direction-options.json @@ -0,0 +1,187 @@ +{ + "title": "Choose the new MoodlIA visual world", + "question": "Impeccable has selected a direction. Keep it, choose an alternate, or ask for a new hand.", + "options": [ + { + "id": "assigned", + "label": "The MoodlIA Workbench", + "kicker": "THE ROLL", + "lineage": "precision teaching instruments and modular workshop boards", + "thesis": "Three distinct instruments share one calibrated work surface, making the ecosystem tangible before it is explained.", + "palette": ["#132C27", "#F4F0E7", "#FF5C35", "#DFFF5B"], + "materials": ["dark green enamel", "anodized rails", "translucent instrument glass", "tactile labels"], + "viewport": "A full-height work surface is divided by a monumental 3 into three live image bays; the promise and primary action sit on a compact calibration plate.", + "risk": "The industrial vocabulary must stay warm and educational rather than becoming a developer console.", + "raised": [ + {"from": "starship terminal", "raise": "Every label and state now has operational precision without inheriting science-fiction styling."}, + {"from": "street-fair flyer", "raise": "Color commits to whole project zones instead of appearing as small decorative accents."}, + {"from": "curved-crease shell", "raise": "One continuous structural gesture carries the complete page rather than a stack of unrelated sections."}, + {"from": "seven-segment instruments", "raise": "Inactive and active project states are both deliberately designed."} + ], + "comp": ".impeccable/mocks/decision/assigned.webp", + "wireframe": { + "cols": 12, + "rows": 10, + "regions": [ + {"label": "brand rail", "x": 0, "y": 0, "w": 12, "h": 1, "accent": false}, + {"label": "promise plate", "x": 0, "y": 1, "w": 4, "h": 8, "accent": true}, + {"label": "three instrument bays", "x": 4, "y": 1, "w": 8, "h": 8, "accent": true}, + {"label": "route selector", "x": 0, "y": 9, "w": 12, "h": 1, "accent": false} + ] + } + }, + { + "id": "model-pick", + "label": "Campus Wayfinding", + "kicker": "IMPECCABLE’S PICK", + "lineage": "university wayfinding systems and screenprinted campus maps", + "thesis": "MoodlIA becomes a place with three unmistakable routes and one welcoming help desk.", + "palette": ["#F7F4EA", "#1A3D8F", "#FFD447", "#EA5B3A"], + "materials": ["vitreous enamel signs", "printed map paper", "painted route lines"], + "viewport": "A giant route map starts at MoodlIA and splits into three color-coded destinations around concise copy and a single departure action.", + "risk": "It is highly legible but more familiar and potentially more institutional than the assigned direction.", + "comp": ".impeccable/mocks/decision/model-pick.webp", + "wireframe": { + "cols": 12, + "rows": 10, + "regions": [ + {"label": "station header", "x": 0, "y": 0, "w": 12, "h": 1, "accent": false}, + {"label": "route statement", "x": 0, "y": 1, "w": 5, "h": 4, "accent": true}, + {"label": "three-way map", "x": 4, "y": 1, "w": 8, "h": 8, "accent": true}, + {"label": "destinations", "x": 0, "y": 6, "w": 4, "h": 3, "accent": false} + ] + } + }, + { + "id": "challenger-paper-automata", + "label": "Learning Automata", + "verdict": "competitive", + "lineage": "hand-cranked paper teaching models", + "thesis": "The three project families unfold as a coordinated paper mechanism driven by one shared crank.", + "palette": ["#F6F0E3", "#2A2925", "#C62D36", "#D5B98A"], + "materials": ["cut paper", "kraft board", "pinned joints", "cast shadows"], + "viewport": "Three paper figures open in sequence around a large central crank while short labels explain the value of each movement.", + "case": "Strong educator recognition and memorable motion; product scanning is slower than the workbench.", + "risk": "The tactile charm could feel child-focused if the typography and mechanics lack precision.", + "comp": ".impeccable/mocks/decision/challenger-paper-automata.webp", + "hero": "https://impeccable.style/worlds/cards/kinetic-sculpture-automata-crank-paper-menagerie-hero.webp", + "board": "https://impeccable.style/worlds/cards/kinetic-sculpture-automata-crank-paper-menagerie.webp", + "wireframe": { + "cols": 12, + "rows": 10, + "regions": [ + {"label": "title strip", "x": 0, "y": 0, "w": 12, "h": 2, "accent": false}, + {"label": "linked figures", "x": 0, "y": 2, "w": 12, "h": 6, "accent": true}, + {"label": "crank control", "x": 4, "y": 8, "w": 4, "h": 2, "accent": true} + ] + } + }, + { + "id": "challenger-one-bit", + "label": "One-bit Learning Desktop", + "verdict": "competitive", + "lineage": "early monochrome education desktops", + "thesis": "Each MoodlIA way opens as a crisp tool window on one shared black-and-white desktop.", + "palette": ["#FAFAF7", "#111111"], + "materials": ["one-pixel chrome", "ordered dithers", "marching selections", "pixel icons"], + "viewport": "Three overlapping windows reveal AI integration, teaching tools, and insights with a persistent help menu.", + "case": "Excellent product clarity and open-source character; weaker identification for non-technical educators.", + "risk": "The interface can read as retro novelty unless every pixel and interaction is disciplined.", + "comp": ".impeccable/mocks/decision/challenger-one-bit.webp", + "hero": "https://impeccable.style/worlds/cards/medium-native-one-bit-desktop-hero.webp", + "board": "https://impeccable.style/worlds/cards/medium-native-one-bit-desktop.webp", + "wireframe": { + "cols": 12, + "rows": 10, + "regions": [ + {"label": "desktop menu", "x": 0, "y": 0, "w": 12, "h": 1, "accent": false}, + {"label": "intro window", "x": 0, "y": 1, "w": 5, "h": 5, "accent": true}, + {"label": "project windows", "x": 4, "y": 2, "w": 8, "h": 7, "accent": false} + ] + } + }, + { + "id": "challenger-starship", + "label": "Operations Terminal", + "verdict": "declined", + "lineage": "used-future starship crew terminals", + "thesis": "MoodlIA behaves like a mission terminal with three operational commands.", + "palette": ["#07110D", "#70FF9A", "#FFB340", "#DED8C8"], + "materials": ["curved CRT glass", "stenciled plates", "phosphor readouts"], + "viewport": "A single command line reveals the three ways as typed operational pages.", + "case": "Strong operational grammar but directly conflicts with the non-technical audience.", + "kept": "Operational precision for labels, state, and feedback.", + "risk": "It would position MoodlIA as a developer tool rather than an educator ecosystem.", + "comp": ".impeccable/mocks/decision/challenger-starship.webp", + "hero": "https://impeccable.style/worlds/cards/pop-culture-shelf-industrial-starship-terminal-hero.webp" + }, + { + "id": "challenger-street-fair", + "label": "Open Learning Fair", + "verdict": "declined", + "lineage": "screenprinted street-fair flyers", + "thesis": "The ecosystem becomes a vivid public event where every project has a loud invitation.", + "palette": ["#F3EDE0", "#111111", "#FF6A00", "#7B57F0"], + "materials": ["riso grain", "gouache flats", "torn paper", "stickers"], + "viewport": "A full-bleed collage carries one enormous multicolor word and one calm white project finder.", + "case": "High attention but insufficient calm and clarity for choosing practical Moodle tools.", + "kept": "Color must own full regions instead of appearing as timid accent decoration.", + "risk": "The promotional energy could obscure the three-way model.", + "comp": ".impeccable/mocks/decision/challenger-street-fair.webp", + "hero": "https://impeccable.style/worlds/cards/fly-posted-festival-hoarding-built-hero.webp" + }, + { + "id": "challenger-curved-crease", + "label": "Folded Learning Map", + "verdict": "declined", + "lineage": "curved-crease paper structures", + "thesis": "One continuous fold raises three useful surfaces from a single MoodlIA sheet.", + "palette": ["#F2E9D7", "#282724", "#D35B3F"], + "materials": ["cotton paper", "graphite shadows", "compass arcs"], + "viewport": "A monumental paper disc bends into three labeled planes around a restrained introduction.", + "case": "Beautiful ecosystem metaphor but slow to explain concrete projects.", + "kept": "One structural gesture should organize the complete experience.", + "risk": "The sculptural abstraction could hide the product offer.", + "comp": ".impeccable/mocks/decision/challenger-curved-crease.webp", + "hero": "https://impeccable.style/worlds/cards/paper-folds-pleats-deployable-curved-crease-shell-hero.webp" + }, + { + "id": "challenger-seven-segment", + "label": "Three Signals", + "verdict": "declined", + "lineage": "seven-segment instrument displays", + "thesis": "The ecosystem is reduced to three synchronized signals that switch from waiting to useful.", + "palette": ["#111413", "#FF3D2E", "#F0A52B", "#44D779"], + "materials": ["matte instrument glass", "LED segments", "ghost cells"], + "viewport": "A fixed mask shows a giant 3 and three product readings whose segments ignite as visitors move through them.", + "case": "Memorable states but too numerical for a broad teaching audience.", + "kept": "Inactive states receive as much design attention as active ones.", + "risk": "The signal language would reduce nuanced project differences to a gimmick.", + "comp": ".impeccable/mocks/decision/challenger-seven-segment.webp", + "hero": "https://impeccable.style/worlds/cards/signals-instruments-seven-segment-alarm-clock-hero.webp" + } + ], + "reroll": {"registers": ["safer", "bolder"]}, + "buildPath": {"value": "code", "toggle": true}, + "canon": true, + "canonCard": { + "label": "The category standard", + "thesis": "A polished education-technology landing page with a conventional hero and three product cards.", + "palette": ["#FFFFFF", "#17233A", "#3157D8"], + "materials": ["clean grid", "rounded cards", "product imagery"], + "viewport": "A left-aligned promise, an image mosaic, and three familiar solution cards below it.", + "risk": "Clear and dependable, but intentionally difficult to distinguish from other software suites.", + "comp": ".impeccable/mocks/decision/canon.webp", + "wireframe": { + "cols": 12, + "rows": 10, + "regions": [ + {"label": "navigation", "x": 0, "y": 0, "w": 12, "h": 1, "accent": false}, + {"label": "hero copy", "x": 0, "y": 1, "w": 5, "h": 5, "accent": true}, + {"label": "hero image", "x": 5, "y": 1, "w": 7, "h": 5, "accent": false}, + {"label": "three cards", "x": 0, "y": 7, "w": 12, "h": 3, "accent": false} + ] + } + }, + "steer": true +} diff --git a/.impeccable/prompts/moodlia-ai-companion-v2.txt b/.impeccable/prompts/moodlia-ai-companion-v2.txt new file mode 100644 index 0000000..cebac65 --- /dev/null +++ b/.impeccable/prompts/moodlia-ai-companion-v2.txt @@ -0,0 +1,12 @@ +Use case: photorealistic-natural +Asset type: portrait editorial image for the MoodlIA education website, representing AI as a helpful planning companion +Primary request: create a warm, contemporary editorial photograph of an adult educator calmly preparing a Moodle course at a bright shared learning table; the technology should feel supportive and secondary, while the educator, printed lesson notes, colored index tabs, and a simple laptop are the human focus +Scene/backdrop: modern public learning commons with daylight, books and soft activity in the distant background +Subject: one adult educator in a natural candid moment, reviewing lesson materials beside a laptop +Style/medium: premium natural editorial photography, tactile paper details, credible real-world education, not a corporate stock photo +Composition/framing: vertical 4:5 composition with the subject offset slightly right and clean negative space near the upper left; layered paper edges subtly recall a carefully curated playlist insert without depicting a cassette +Lighting/mood: soft morning daylight, optimistic, calm, approachable +Color palette: warm cream, ballpoint blue, muted coral red, soft golden yellow, charcoal accents +Materials/textures: paper, linen, wood, matte laptop surface +Constraints: no readable text, no logos, no screens with legible interfaces, no futuristic holograms, no neon, no robots, no watermark +Avoid: technical dashboards, dark cyber imagery, exaggerated AI symbols, staged corporate poses diff --git a/.impeccable/prompts/moodlia-educators-together-v2.txt b/.impeccable/prompts/moodlia-educators-together-v2.txt new file mode 100644 index 0000000..4a45f78 --- /dev/null +++ b/.impeccable/prompts/moodlia-educators-together-v2.txt @@ -0,0 +1,12 @@ +Use case: ads-marketing +Asset type: wide editorial hero photograph and social preview background for the MoodlIA education website +Primary request: create one cohesive, human-centered scene that shows Moodle becoming easier through three connected moments: planning with a helpful laptop, reviewing work with a rubric, and understanding learning progress with a simple printed overview; these should feel like one carefully curated teaching day, not three separate product demos +Scene/backdrop: a bright modern learning commons with one long shared table, daylight, books, plants, and subtle background activity +Subject: three adult educators of varied appearance collaborating naturally across the table, each focused on a different real teaching task; paper and conversation lead, technology stays secondary +Style/medium: premium contemporary editorial photography, candid and tactile, warm education campaign, not corporate stock photography +Composition/framing: wide 3:2 landscape, three natural zones connected by a loose line of colored index cards across the table; keep generous calm negative space in the upper left for website headline overlay; no literal cassette, but the arrangement can subtly evoke a thoughtfully sequenced personal selection +Lighting/mood: optimistic natural daylight, warm, calm, helpful, approachable +Color palette: warm cream, ballpoint blue, muted coral red, soft golden yellow, charcoal accents +Materials/textures: uncoated paper, card stock, linen, wood, matte laptop +Constraints: no readable text, no logos, no legible computer UI, no student names, no holograms, no robots, no watermark +Avoid: dark technology imagery, floating dashboards, exaggerated AI visuals, staged corporate poses, childish classroom clichés diff --git a/.impeccable/prompts/moodlia-learning-clarity-v2.txt b/.impeccable/prompts/moodlia-learning-clarity-v2.txt new file mode 100644 index 0000000..c3f6cd6 --- /dev/null +++ b/.impeccable/prompts/moodlia-learning-clarity-v2.txt @@ -0,0 +1,12 @@ +Use case: photorealistic-natural +Asset type: portrait editorial image for the MoodlIA education website, representing understanding learning progress and deciding where to help +Primary request: create a warm, contemporary editorial photograph of an adult educator calmly reviewing a simple printed learning overview and arranging three colored markers to prioritize where support is needed; the moment should communicate clarity and care, not analytics technology +Scene/backdrop: bright learning commons or staff workspace with daylight and softly blurred bookshelves +Subject: one adult educator in a reflective natural moment, looking between a concise printed chart and a small set of colored index cards +Style/medium: premium natural editorial photography, human-centered and credible, tactile paper details, not a corporate stock photo +Composition/framing: vertical 4:5 composition with subject offset slightly left, chart and markers clearly visible but containing no readable text, clean negative space near upper right; subtle folded paper layering evokes a personal curated selection without showing a cassette +Lighting/mood: gentle afternoon daylight, lucid, caring, quietly optimistic +Color palette: warm cream, ballpoint blue, muted coral red, soft golden yellow, charcoal accents +Materials/textures: uncoated paper, card stock, wood, linen, ballpoint marks +Constraints: no readable text, no logos, no screens with legible interfaces, no student names, no watermark +Avoid: glowing dashboards, surveillance imagery, futuristic analytics, dark technology scenes, staged corporate poses diff --git a/.impeccable/prompts/moodlia-teaching-flow-v2.txt b/.impeccable/prompts/moodlia-teaching-flow-v2.txt new file mode 100644 index 0000000..7995f03 --- /dev/null +++ b/.impeccable/prompts/moodlia-teaching-flow-v2.txt @@ -0,0 +1,12 @@ +Use case: photorealistic-natural +Asset type: portrait editorial image for the MoodlIA education website, representing practical teaching and assessment tools +Primary request: create a warm, contemporary editorial photograph of an adult educator reviewing student work with a simple rubric, colored cards, and handwritten annotations; show a calm, manageable workflow and the feeling of confident feedback +Scene/backdrop: bright flexible classroom or learning studio with soft daylight and subtle educational materials in the background +Subject: one adult educator at a table, hands sorting a small set of student pages and feedback cards; human judgment is clearly central +Style/medium: premium natural editorial photography, tactile paper details, credible education setting, not a corporate stock photo +Composition/framing: vertical 4:5 composition, hands and paper workflow prominent, subject visible and engaged, enough breathing room around the scene; layered paper edges subtly evoke a carefully prepared personal selection without showing a cassette +Lighting/mood: warm daylight, focused, reassuring, practical +Color palette: warm cream, ballpoint blue, muted coral red, soft golden yellow, charcoal accents +Materials/textures: paper, card stock, wood, linen, ballpoint ink +Constraints: no readable text, no logos, no screens with legible interfaces, no grades or student names, no watermark +Avoid: futuristic interfaces, piles of overwhelming paperwork, staged corporate poses, childish classroom clichés diff --git a/.impeccable/questions/1c4e9dff.answer.json b/.impeccable/questions/1c4e9dff.answer.json new file mode 100644 index 0000000..d72b040 --- /dev/null +++ b/.impeccable/questions/1c4e9dff.answer.json @@ -0,0 +1 @@ +{"optionId":"challenger-mixtape","steer":"","hero":"https://impeccable.style/worlds/cards/vernacular-ephemera-cassette-j-card-hero.webp","board":"https://impeccable.style/worlds/cards/vernacular-ephemera-cassette-j-card.webp","comp":".impeccable/mocks/decision/learning-selection.webp","buildPath":"code","buildPathFlipped":false} diff --git a/.impeccable/questions/1c4e9dff.log b/.impeccable/questions/1c4e9dff.log new file mode 100644 index 0000000..e69de29 diff --git a/.impeccable/questions/1c4e9dff.state.json b/.impeccable/questions/1c4e9dff.state.json new file mode 100644 index 0000000..e726242 --- /dev/null +++ b/.impeccable/questions/1c4e9dff.state.json @@ -0,0 +1 @@ +{"pid":23536,"port":58402,"url":"http://127.0.0.1:58402/","lastBeat":1787180219117} \ No newline at end of file diff --git a/.impeccable/questions/7de1a169.answer.json b/.impeccable/questions/7de1a169.answer.json new file mode 100644 index 0000000..d72b040 --- /dev/null +++ b/.impeccable/questions/7de1a169.answer.json @@ -0,0 +1 @@ +{"optionId":"challenger-mixtape","steer":"","hero":"https://impeccable.style/worlds/cards/vernacular-ephemera-cassette-j-card-hero.webp","board":"https://impeccable.style/worlds/cards/vernacular-ephemera-cassette-j-card.webp","comp":".impeccable/mocks/decision/learning-selection.webp","buildPath":"code","buildPathFlipped":false} diff --git a/.impeccable/questions/7de1a169.log b/.impeccable/questions/7de1a169.log new file mode 100644 index 0000000..e69de29 diff --git a/.impeccable/questions/7de1a169.state.json b/.impeccable/questions/7de1a169.state.json new file mode 100644 index 0000000..9814470 --- /dev/null +++ b/.impeccable/questions/7de1a169.state.json @@ -0,0 +1 @@ +{"pid":35672,"port":62339,"url":"http://127.0.0.1:62339/","lastBeat":1787179801279,"claimedAt":1787179771530} \ No newline at end of file diff --git a/.impeccable/questions/a649f1ee.log b/.impeccable/questions/a649f1ee.log new file mode 100644 index 0000000..e69de29 diff --git a/.impeccable/references/helpful-selection-board.webp b/.impeccable/references/helpful-selection-board.webp new file mode 100644 index 0000000..2cc6c9a Binary files /dev/null and b/.impeccable/references/helpful-selection-board.webp differ diff --git a/.impeccable/references/helpful-selection-hero.webp b/.impeccable/references/helpful-selection-hero.webp new file mode 100644 index 0000000..ffbece2 Binary files /dev/null and b/.impeccable/references/helpful-selection-hero.webp differ diff --git a/.impeccable/references/paper-automata-board.webp b/.impeccable/references/paper-automata-board.webp new file mode 100644 index 0000000..bbd4bf9 Binary files /dev/null and b/.impeccable/references/paper-automata-board.webp differ diff --git a/.impeccable/references/paper-automata-hero.webp b/.impeccable/references/paper-automata-hero.webp new file mode 100644 index 0000000..0924d40 Binary files /dev/null and b/.impeccable/references/paper-automata-hero.webp differ diff --git a/.impeccable/review/desktop-corrected.png b/.impeccable/review/desktop-corrected.png new file mode 100644 index 0000000..f264d13 Binary files /dev/null and b/.impeccable/review/desktop-corrected.png differ diff --git a/.impeccable/review/desktop-final.png b/.impeccable/review/desktop-final.png new file mode 100644 index 0000000..f320ca1 Binary files /dev/null and b/.impeccable/review/desktop-final.png differ diff --git a/.impeccable/review/desktop.png b/.impeccable/review/desktop.png new file mode 100644 index 0000000..40e30e0 Binary files /dev/null and b/.impeccable/review/desktop.png differ diff --git a/.impeccable/review/mobile-confirmed.png b/.impeccable/review/mobile-confirmed.png new file mode 100644 index 0000000..798b11e Binary files /dev/null and b/.impeccable/review/mobile-confirmed.png differ diff --git a/.impeccable/review/mobile-corrected.png b/.impeccable/review/mobile-corrected.png new file mode 100644 index 0000000..4f14199 Binary files /dev/null and b/.impeccable/review/mobile-corrected.png differ diff --git a/.impeccable/review/mobile-final.png b/.impeccable/review/mobile-final.png new file mode 100644 index 0000000..4e2a8aa Binary files /dev/null and b/.impeccable/review/mobile-final.png differ diff --git a/.impeccable/review/mobile.png b/.impeccable/review/mobile.png new file mode 100644 index 0000000..bad5f6a Binary files /dev/null and b/.impeccable/review/mobile.png differ diff --git a/.impeccable/review/product-desktop.png b/.impeccable/review/product-desktop.png new file mode 100644 index 0000000..798adf0 Binary files /dev/null and b/.impeccable/review/product-desktop.png differ diff --git a/.impeccable/review/product-mobile.png b/.impeccable/review/product-mobile.png new file mode 100644 index 0000000..d43cac2 Binary files /dev/null and b/.impeccable/review/product-mobile.png differ diff --git a/.impeccable/surface-home.md b/.impeccable/surface-home.md new file mode 100644 index 0000000..092d0bf --- /dev/null +++ b/.impeccable/surface-home.md @@ -0,0 +1,23 @@ +Scope: MoodlIA public home page. + +Mode: Persuade. + +Audience: Educators and Moodle site or course leaders who want practical help rather than a technical product catalogue. + +Primary action: Explore one of the three ways MoodlIA helps. Secondary action: email contact@moodlia.com for direct help. + +Proof available: Named open projects in each way and direct support contact. No customer logos, metrics, or testimonials are currently approved. + +Chosen direction: Learning Automata. The page is a hand-cranked paper mechanism built from kraft board, pulp-white cut paper, shadow ink, one crimson active fold, brass pins, tabs, and a single continuous rail. The user selected this competitive challenger direction with seed 9346b343. + +Memorable moment: The first viewport presents three articulated paper mechanisms on one rail, with a real crank control that moves all three together. + +Responsive behavior: Desktop shows the complete mechanism at once. Mobile preserves all three small mechanisms in one viewport, then turns the long project sequence into a single-column rail. + +Accessibility and motion: Semantic landmarks and headings, visible focus, touch targets of at least 44 pixels, reduced-motion support, useful alt text, and no automatic animation. The crank is the one authored motion and starts only after a user action. + +Localization: The full surface is available in English and Spanish. The language switch keeps the visitor on the equivalent page, and GitHub is not mentioned on the homepage. + +SEO: Concise benefit-led copy, one H1, descriptive H2 and H3 structure, localized canonical and language-alternate metadata, Open Graph and Twitter image, organization and item-list structured data, robots.txt, and sitemap.xml. + +Unresolved boundaries: No deployment or publication is part of this redesign pass. diff --git a/.impeccable/surface-product-detail.md b/.impeccable/surface-product-detail.md new file mode 100644 index 0000000..a32f850 --- /dev/null +++ b/.impeccable/surface-product-detail.md @@ -0,0 +1,25 @@ +Scope: MoodlIA product detail pages for the ten products and product families listed on the homepage. + +Mode: Persuade. + +Audience: Educators, Moodle administrators, and developers who want to understand one project before opening its repository or asking for help. + +Primary action: Open the real project source or package. Secondary action: contact MoodlIA for help. + +GitHub boundary: Repository language and links appear only on individual product pages, never in global navigation, the homepage, or way pages. + +Truth source: app/catalog.ts, derived from local README files, package metadata, and repository remotes. + +Inherited direction: Learning Automata, seed 9346b343. Product pages reuse the material system without copying the homepage's three-on-one-rail composition. + +Structure: A cut-paper product statement and pinned identity sheet lead into a plain-language introduction. Three deliberately staggered paper sheets cover capabilities, fit, and requirements. A shared rail links related products supporting the same way of working. + +Responsive behavior: Paired hero content becomes one column on mobile. The three information sheets stack and related projects move from a horizontal to a vertical rail. + +Accessibility: One H1, visible breadcrumbs, semantic sections, descriptive link labels, at least 44-pixel interactive targets, visible focus, and inherited reduced-motion support. + +Localization: Every product page is complete in English and Spanish, and the language switch preserves the current product. + +SEO: Every product has localized visible copy, title, description, canonical and language-alternate URLs, social metadata using its way's existing image, SoftwareApplication structured data, and sitemap entries. + +Boundary: Product pages provide orientation, not duplicated repository documentation or fabricated release claims. diff --git a/.impeccable/surface-way-detail.md b/.impeccable/surface-way-detail.md new file mode 100644 index 0000000..b9dd381 --- /dev/null +++ b/.impeccable/surface-way-detail.md @@ -0,0 +1,19 @@ +Scope: MoodlIA detail pages for the three ways forward: AI integration, teaching tools, and learning insights. + +Audience: Educators, Moodle administrators, and developers who know what they want to improve but may not know which MoodlIA project fits. + +Primary action: Explore the projects that support the chosen way of working. + +Secondary action: Ask MoodlIA for direct help. + +Voice: Clear, practical, supportive, and non-technical until product-specific detail is useful. + +Structure: A pinned image and benefit-led introduction lead into one continuous product ledger. The ledger is a connected mechanism, not a card grid. A paper outcome sheet explains what this way unlocks before the help panel. + +Accessibility: One H1, explicit section labels, descriptive links, keyboard-visible focus, useful image alternatives, and reduced-motion support. + +Localization: Every page and project description is complete in English and Spanish. The language switch preserves the current way. GitHub is not mentioned on these pages. + +SEO: Every way has localized route-specific titles, descriptions, canonical and language-alternate URLs, social metadata based on its existing project image, CollectionPage structured data, and sitemap entries. + +Boundary: Build locally and verify the static export. Do not publish. diff --git a/.impeccable/surfaces/app-es-page-tsx.md b/.impeccable/surfaces/app-es-page-tsx.md new file mode 100644 index 0000000..0644d4f --- /dev/null +++ b/.impeccable/surfaces/app-es-page-tsx.md @@ -0,0 +1,30 @@ +--- +version: 1 +slug: "app-es-page-tsx" +primary_target: "app/es/page.tsx" +related_targets: ["app/page.tsx","app/localization.ts","app/globals.css"] +--- + +Scope: MoodlIA public home page. + +Mode: Persuade. + +Audience: Educators and Moodle site or course leaders who want practical help rather than a technical product catalogue. + +Primary action: Explore one of the three ways MoodlIA helps. Secondary action: email contact@moodlia.com for direct help. + +Proof available: Named open projects in each way and direct support contact. No customer logos, metrics, or testimonials are currently approved. + +Chosen direction: Learning Automata. The page is a hand-cranked paper mechanism built from kraft board, pulp-white cut paper, shadow ink, one crimson active fold, brass pins, tabs, and a single continuous rail. The user selected this competitive challenger direction with seed 9346b343. + +Memorable moment: The first viewport presents three articulated paper mechanisms on one rail, with a real crank control that moves all three together. + +Responsive behavior: Desktop shows the complete mechanism at once. Mobile preserves all three small mechanisms in one viewport, then turns the long project sequence into a single-column rail. + +Accessibility and motion: Semantic landmarks and headings, visible focus, touch targets of at least 44 pixels, reduced-motion support, useful alt text, and no automatic animation. The crank is the one authored motion and starts only after a user action. + +Localization: The full surface is available in English and Spanish. The language switch keeps the visitor on the equivalent page, and GitHub is not mentioned on the homepage. + +SEO: Concise benefit-led copy, one H1, descriptive H2 and H3 structure, localized canonical and language-alternate metadata, Open Graph and Twitter image, organization and item-list structured data, robots.txt, and sitemap.xml. + +Unresolved boundaries: No deployment or publication is part of this redesign pass. diff --git a/.impeccable/surfaces/app-es-products-slug-page-tsx.md b/.impeccable/surfaces/app-es-products-slug-page-tsx.md new file mode 100644 index 0000000..9caf95d --- /dev/null +++ b/.impeccable/surfaces/app-es-products-slug-page-tsx.md @@ -0,0 +1,32 @@ +--- +version: 1 +slug: "app-es-products-slug-page-tsx" +primary_target: "app/es/products/[slug]/page.tsx" +related_targets: ["app/detail-pages.tsx","app/localization.ts","app/globals.css"] +--- + +Scope: MoodlIA product detail pages for the ten products and product families listed on the homepage. + +Mode: Persuade. + +Audience: Educators, Moodle administrators, and developers who want to understand one project before opening its repository or asking for help. + +Primary action: Open the real project source or package. Secondary action: contact MoodlIA for help. + +GitHub boundary: Repository language and links appear only on individual product pages, never in global navigation, the homepage, or way pages. + +Truth source: app/catalog.ts, derived from local README files, package metadata, and repository remotes. + +Inherited direction: Learning Automata, seed 9346b343. Product pages reuse the material system without copying the homepage's three-on-one-rail composition. + +Structure: A cut-paper product statement and pinned identity sheet lead into a plain-language introduction. Three deliberately staggered paper sheets cover capabilities, fit, and requirements. A shared rail links related products supporting the same way of working. + +Responsive behavior: Paired hero content becomes one column on mobile. The three information sheets stack and related projects move from a horizontal to a vertical rail. + +Accessibility: One H1, visible breadcrumbs, semantic sections, descriptive link labels, at least 44-pixel interactive targets, visible focus, and inherited reduced-motion support. + +Localization: Every product page is complete in English and Spanish, and the language switch preserves the current product. + +SEO: Every product has localized visible copy, title, description, canonical and language-alternate URLs, social metadata using its way's existing image, SoftwareApplication structured data, and sitemap entries. + +Boundary: Product pages provide orientation, not duplicated repository documentation or fabricated release claims. diff --git a/.impeccable/surfaces/app-es-ways-slug-page-tsx.md b/.impeccable/surfaces/app-es-ways-slug-page-tsx.md new file mode 100644 index 0000000..7bec1b8 --- /dev/null +++ b/.impeccable/surfaces/app-es-ways-slug-page-tsx.md @@ -0,0 +1,26 @@ +--- +version: 1 +slug: "app-es-ways-slug-page-tsx" +primary_target: "app/es/ways/[slug]/page.tsx" +related_targets: ["app/detail-pages.tsx","app/localization.ts","app/globals.css"] +--- + +Scope: MoodlIA detail pages for the three ways forward: AI integration, teaching tools, and learning insights. + +Audience: Educators, Moodle administrators, and developers who know what they want to improve but may not know which MoodlIA project fits. + +Primary action: Explore the projects that support the chosen way of working. + +Secondary action: Ask MoodlIA for direct help. + +Voice: Clear, practical, supportive, and non-technical until product-specific detail is useful. + +Structure: A pinned image and benefit-led introduction lead into one continuous product ledger. The ledger is a connected mechanism, not a card grid. A paper outcome sheet explains what this way unlocks before the help panel. + +Accessibility: One H1, explicit section labels, descriptive links, keyboard-visible focus, useful image alternatives, and reduced-motion support. + +Localization: Every page and project description is complete in English and Spanish. The language switch preserves the current way. GitHub is not mentioned on these pages. + +SEO: Every way has localized route-specific titles, descriptions, canonical and language-alternate URLs, social metadata based on its existing project image, CollectionPage structured data, and sitemap entries. + +Boundary: Build locally and verify the static export. Do not publish. diff --git a/.impeccable/surfaces/app-page-tsx.md b/.impeccable/surfaces/app-page-tsx.md new file mode 100644 index 0000000..e286a04 --- /dev/null +++ b/.impeccable/surfaces/app-page-tsx.md @@ -0,0 +1,32 @@ +--- +version: 1 +slug: "app-page-tsx" +primary_target: "app/page.tsx" +related_targets: ["app/localization.ts","app/globals.css","app/site-chrome.tsx"] +--- + +Scope: MoodlIA public home page. + +Mode: Persuade. + +Audience: Educators and Moodle site or course leaders who want practical help before technical product detail. + +Primary action: Choose one of three outcome-led ways MoodlIA helps. Secondary action: email contact@moodlia.com for direct human help, including from the mobile header. + +Proof available: Named open projects within each way and direct support contact. No customer logos, metrics, or testimonials are currently approved. + +Chosen direction: The Helpful Selection. The page combines warm ruled paper, ballpoint-blue structure, accessible coral and ochre accents, concise editorial typography, and mounted educator photography. The experience is human and education-first rather than technical or futuristic. + +Memorable moment: The first viewport pairs the three-line promise with three overlapping educator photographs, followed by a stable three-route rail. + +Information architecture: Lead with teaching outcomes. Each route links to its complete explanation before technical project names, which remain available through progressive disclosure. + +Responsive behavior: Desktop shows the complete hero composition and route rail. Mobile keeps direct help in the header, brings the photograph collage into the opening journey, stacks the route rail, and preserves route order one–two–three. + +Accessibility and motion: Semantic landmarks and headings, visible focus, touch targets of at least 44 pixels, WCAG AA text contrast, reduced-motion support, useful alt text, and no progress-like automatic animation. Staggered hero photography is the only authored entrance. + +Localization: The full surface is available in English and Spanish. The language switch keeps the visitor on the equivalent page, and GitHub is not mentioned on the homepage. + +SEO: Concise benefit-led copy, one H1, descriptive H2 and H3 structure, localized canonical and language-alternate metadata, Open Graph and Twitter image, organization and item-list structured data, robots.txt, and sitemap.xml. + +Unresolved boundaries: No deployment or publication is part of this refinement pass. diff --git a/.impeccable/surfaces/app-products-slug-page-tsx.md b/.impeccable/surfaces/app-products-slug-page-tsx.md new file mode 100644 index 0000000..42dc0c3 --- /dev/null +++ b/.impeccable/surfaces/app-products-slug-page-tsx.md @@ -0,0 +1,32 @@ +--- +version: 1 +slug: "app-products-slug-page-tsx" +primary_target: "app/products/[slug]/page.tsx" +related_targets: ["app/detail-pages.tsx","app/localization.ts","app/globals.css"] +--- + +Scope: MoodlIA product detail pages for the ten products and product families listed on the homepage. + +Mode: Persuade. + +Audience: Educators, Moodle administrators, and developers who want to understand one project before opening its repository or asking for help. + +Primary action: Open the real project source or package. Secondary action: contact MoodlIA for help. + +GitHub boundary: Repository language and links appear only on individual product pages, never in global navigation, the homepage, or way pages. + +Truth source: app/catalog.ts, derived from local README files, package metadata, and repository remotes. + +Inherited direction: Learning Automata, seed 9346b343. Product pages reuse the material system without copying the homepage's three-on-one-rail composition. + +Structure: A cut-paper product statement and pinned identity sheet lead into a plain-language introduction. Three deliberately staggered paper sheets cover capabilities, fit, and requirements. A shared rail links related products supporting the same way of working. + +Responsive behavior: Paired hero content becomes one column on mobile. The three information sheets stack and related projects move from a horizontal to a vertical rail. + +Accessibility: One H1, visible breadcrumbs, semantic sections, descriptive link labels, at least 44-pixel interactive targets, visible focus, and inherited reduced-motion support. + +Localization: Every product page is complete in English and Spanish, and the language switch preserves the current product. + +SEO: Every product has localized visible copy, title, description, canonical and language-alternate URLs, social metadata using its way's existing image, SoftwareApplication structured data, and sitemap entries. + +Boundary: Product pages provide orientation, not duplicated repository documentation or fabricated release claims. diff --git a/.impeccable/surfaces/app-ways-slug-page-tsx.md b/.impeccable/surfaces/app-ways-slug-page-tsx.md new file mode 100644 index 0000000..15e4d3a --- /dev/null +++ b/.impeccable/surfaces/app-ways-slug-page-tsx.md @@ -0,0 +1,26 @@ +--- +version: 1 +slug: "app-ways-slug-page-tsx" +primary_target: "app/ways/[slug]/page.tsx" +related_targets: ["app/detail-pages.tsx","app/localization.ts","app/globals.css"] +--- + +Scope: MoodlIA detail pages for the three ways forward: AI integration, teaching tools, and learning insights. + +Audience: Educators, Moodle administrators, and developers who know what they want to improve but may not know which MoodlIA project fits. + +Primary action: Explore the projects that support the chosen way of working. + +Secondary action: Ask MoodlIA for direct help. + +Voice: Clear, practical, supportive, and non-technical until product-specific detail is useful. + +Structure: A pinned image and benefit-led introduction lead into one continuous product ledger. The ledger is a connected mechanism, not a card grid. A paper outcome sheet explains what this way unlocks before the help panel. + +Accessibility: One H1, explicit section labels, descriptive links, keyboard-visible focus, useful image alternatives, and reduced-motion support. + +Localization: Every page and project description is complete in English and Spanish. The language switch preserves the current way. GitHub is not mentioned on these pages. + +SEO: Every way has localized route-specific titles, descriptions, canonical and language-alternate URLs, social metadata based on its existing project image, CollectionPage structured data, and sitemap entries. + +Boundary: Build locally and verify the static export. Do not publish. diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..257e62c --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,233 @@ +--- +name: MoodlIA The Helpful Selection +description: A warm editorial system that presents practical Moodle help through people, paper, and three clear ways forward. +colors: + canvas: "#f7f2e8" + paper: "#fffdf7" + ink: "#202733" + ink-soft: "#626875" + ballpoint-blue: "#315b9a" + deep-blue: "#18375f" + active-coral: "#b5443b" + pressed-coral: "#8f302a" + marker-yellow: "#f2c451" + quiet-mint: "#a8c7b7" + rule: "#d8d2c6" + focus: "#0d5bd7" +typography: + display: + fontFamily: "Bricolage Grotesque, Arial, sans-serif" + fontSize: "clamp(4rem, 7.8vw, 7.7rem)" + fontWeight: 720 + lineHeight: 0.83 + letterSpacing: "-0.04em" + headline: + fontFamily: "Bricolage Grotesque, Arial, sans-serif" + fontSize: "clamp(3rem, 6.2vw, 6rem)" + fontWeight: 720 + lineHeight: 0.95 + letterSpacing: "-0.04em" + title: + fontFamily: "Bricolage Grotesque, Arial, sans-serif" + fontSize: "clamp(1.55rem, 3vw, 2.5rem)" + fontWeight: 720 + lineHeight: 1 + letterSpacing: "-0.035em" + body: + fontFamily: "DM Sans, Arial, sans-serif" + fontSize: "1rem" + fontWeight: 400 + lineHeight: 1.68 + letterSpacing: "normal" + label: + fontFamily: "DM Sans, Arial, sans-serif" + fontSize: "0.72rem" + fontWeight: 800 + lineHeight: 1.3 + letterSpacing: "0.08em" +rounded: + control: "0.35rem" + inner-paper: "0.75rem" + panel: "1.2rem" +spacing: + page-edge: "clamp(1rem, 4vw, 4rem)" + section: "clamp(5rem, 10vw, 9rem)" +components: + primary-action: + backgroundColor: "{colors.active-coral}" + textColor: "#ffffff" + typography: "{typography.label}" + rounded: "{rounded.control}" + padding: "0.8rem 1.2rem" + height: "48px" + primary-action-hover: + backgroundColor: "{colors.pressed-coral}" + textColor: "#ffffff" + text-action: + backgroundColor: "transparent" + textColor: "{colors.ballpoint-blue}" + typography: "{typography.label}" + height: "48px" + help-panel: + backgroundColor: "{colors.deep-blue}" + textColor: "{colors.paper}" + rounded: "{rounded.panel}" +--- + +# Design System: MoodlIA The Helpful Selection + +## Overview + +**Creative North Star: "The Helpful Selection"** + +MoodlIA should feel like a concise selection assembled by an experienced educator: personal, useful, and ready for the teaching moment at hand. Warm ruled paper, ballpoint-blue structure, colored track markers, short handwritten-style annotations, and layered photographs create the care of a prepared editorial insert without drawing a literal cassette or leaning on nostalgia. + +The interface is education-first and deliberately nontechnical. People and teaching decisions lead; product mechanics appear only after a visitor chooses a way forward. The homepage's three overlapping educator photographs and three-track rail make the ecosystem memorable, while way and product pages reuse the same paper, sequencing, and direct-help language without repeating the whole composition. + +**Key Characteristics:** + +- Warm cream paper with quiet blue ruled lines. +- Three numbered routes with stable blue, coral, and yellow accents. +- Real educator photography mounted as overlapping paper prints. +- Large authored display type paired with compact, readable sans-serif copy. +- Ruled lists, captions, tabs, and modest rotations instead of generic card grids. +- Direct human help throughout; GitHub appears only as a product-page action. + +The four shipping `*-v2.jpg` images were generated for this redesign on 2026-08-20. Their prompts require warm editorial education photography, no readable text or logos, and no futuristic or abstract AI imagery; the prompt records live in `.impeccable/prompts/`. + +## Colors + +The palette is warm and paper-led, with blue providing structure, coral providing action, and yellow and mint keeping the three-route story optimistic and human. + +### Primary + +- **Ballpoint Blue** (`ballpoint-blue`): Navigation, structural links, the first route, and the brand-track mark. +- **Deep Blue** (`deep-blue`): Large direct-help panels and high-contrast hover states. + +### Secondary + +- **Active Coral** (`active-coral`): Primary actions, the second route, active underlines, and small emphasis marks. +- **Pressed Coral** (`pressed-coral`): Coral hover and pressed states; never a large passive field. + +### Tertiary + +- **Marker Yellow** (`marker-yellow`): The third hero line, the third route, list bullets, and emphasis on dark-blue panels. +- **Quiet Mint** (`quiet-mint`): Calm photographic backing and small proof markers. + +### Neutral + +- **Warm Canvas** (`canvas`): The ruled page field and default copy backdrop. +- **Clean Paper** (`paper`): Mounted photographs and contrasting editorial sections. +- **Warm Ink** (`ink`): Headlines, rules, and primary reading contrast. +- **Soft Ink** (`ink-soft`): Supporting copy, captions, and metadata. +- **Paper Rule** (`rule`): Dividers, tracklist rows, and subtle structure. +- **Blueprint Focus** (`focus`): Keyboard focus only, chosen for unmistakable contrast. + +**The Three-Track Rule.** AI integration is blue, teaching tools are coral, and learning insights are yellow with dark ink. Number, label, and position must repeat the distinction so color never carries meaning alone. + +**The Paper Leads Rule.** Accent colors identify routes and actions; they do not replace the warm paper field as the dominant surface. + +## Typography + +**Display Font:** Bricolage Grotesque (with Arial and sans-serif fallbacks) +**Body Font:** DM Sans (with Arial and sans-serif fallbacks) + +**Character:** Bricolage Grotesque gives short statements an authored, slightly irregular confidence. DM Sans keeps bilingual navigation, explanations, metadata, and product detail calm and readable. + +### Hierarchy + +- **Display** (weight 720, fluid 4–7.7rem, line-height 0.83): Homepage and detail-page hero statements; short, sentence-case, and tightly set. +- **Headline** (weight 720, fluid 3–6rem, line-height 0.95): Major section transitions and direct-help invitations. +- **Title** (weight 720, fluid 1.55–2.5rem, line-height 1): Tracklist and project titles. +- **Body** (weight 400, 1–1.18rem, line-height 1.62–1.7): Explanatory copy, generally constrained to about 55–68 characters per line. +- **Label** (weight 720–850, 0.68–0.82rem): Navigation, sequence numbers, captions, buttons, and metadata; uppercase is reserved for compact metadata. + +Handwritten character comes from brief rotated annotations and drawn underlines, not a third font. + +**The Two-Voice Rule.** Bricolage Grotesque declares; DM Sans explains and enables action. Do not introduce another display or decorative typeface. + +**The Short Statement Rule.** Large type earns its scale through concise copy. Long technical explanations belong below the hero and on product pages. + +## Layout + +The main container is capped at 1380px with fluid page edges. Sections use generous vertical space, but related content stays dense: a promise beside imagery, a heading beside a short explanation, or a ruled list directly beneath its introduction. + +The homepage opens with a split hero and three overlapping portrait photographs, followed immediately by a horizontal three-track sequence. Route sections alternate a mounted photograph and editorial copy. Way pages pair an opening statement with one photograph before a ruled project tracklist. Product pages pair product identity and actions with the route photograph, then use three practical information columns, related products, and direct help. + +- At 1000px, primary navigation is hidden, the header becomes two-column, and wide grids tighten. +- At 820px, split layouts become single-column, the sequence rail turns vertical, product columns stack, and related-project grids become lists. +- At 620px, page edges become 14px, the contact button leaves the header, hero actions stack, the photo collage becomes compact, and detail figures keep a small inset from the viewport edge. + +Interaction targets are at least 44px tall, and the mobile reading order always keeps copy before its supporting route photograph on detail pages. + +**The Sequence Survives Rule.** Responsive layouts may stack, but route numbers, ruled continuity, captions, and the order one–two–three remain visible. + +## Elevation & Depth + +Depth comes from close paper shadows, overlaps, colored backing sheets, and rotations of roughly one to five degrees. The canonical mounted-paper shadow is `0 1.5rem 4rem rgba(62, 54, 43, .13), 0 .2rem .7rem rgba(62, 54, 43, .1)`. Large image cards may deepen to `0 2.2rem 5rem rgba(62, 54, 43, .18)` while lifting on hover. Primary actions use a smaller coral-tinted shadow that compresses as the button moves one pixel down. + +**The Paper Contact Rule.** Shadows describe one sheet or photograph resting above another. Do not use ambient elevation to make ordinary paragraphs look like application cards. + +## Shapes + +The system is mostly rectangular. Controls use a small 0.35rem radius, inner paper backings use about 0.75rem, and the two major help panels use 1.2rem. Circular geometry is reserved for route numbers, compact arrow controls, list bullets, and the three-stripe brand mark. Photo mounts keep square outer corners while their colored backing sheets may soften slightly. + +Fold-like offsets, ruled borders, caption strips, and slight rotations create material character. Avoid pills, glass surfaces, large generic rounded cards, and decorative boxes around every text group. + +**The Useful Shape Rule.** A circle marks sequence or action; a line connects or separates; a rotated rectangle reads as paper. Do not add geometry without one of those jobs. + +## Components + +### Primary and Text Actions + +- Primary actions are coral, white, compactly rounded, at least 48px high, and set in heavy DM Sans. Hover darkens coral, reduces the shadow, and moves the control down by one pixel. +- Secondary actions are blue text with a two-pixel underline and remain visually subordinate to the coral action. +- Every interactive link or button receives a three-pixel Blueprint Focus outline with a four-pixel offset on `:focus-visible`. + +### Site Navigation and Language Switcher + +- Desktop navigation is centered between the wordmark and actions; its coral underline grows from the left on hover. +- The EN/ES switch is a compact bordered pair with 44px targets. The current language uses Warm Ink on Clean Paper contrast and exposes `aria-current="page"`. +- The header contact action is direct and blue. It remains visible as a compact help action on mobile so human support is never buried below the full page. +- The language switch preserves the equivalent page path. + +### Mounted Educator Photography + +Photography uses a 4:5 crop, a Clean Paper mount, a printed caption, a numbered marker, and a softly rotated colored backing sheet. The homepage hero overlaps three photographs; route and product pages use one larger mounted photograph. Alternative text describes the educator's teaching task, while captions supply the editorial interpretation. + +### Three-Track Rail and Tracklists + +The three-track rail doubles as navigation and ecosystem explanation. It uses numbered circular markers, ruled divisions, text labels, and route-specific hover washes. Product and outcome lists reuse the same numbered ruled rhythm without becoming cards. + +The rail is a stable three-route navigation element and does not imitate progress or loading. Hero photographs provide the one authored entrance in a staggered 0.9-second sequence. Hover movement is limited to interactive elements. `prefers-reduced-motion` reduces animations and transitions to effectively instant, disables smooth scrolling, and removes decorative transforms from selected elements. + +Page navigation treats the content as one paper sheet replacing another while the header remains visually stable. Native cross-document View Transitions handle this when available; the static-site fallback gives the current sheet a 140ms exit and the arriving sheet a 320ms reveal. Same-page anchors keep their normal scroll behavior, modified clicks remain native, and reduced-motion preferences bypass the replacement animation entirely. + +### Direct-Help Panels + +Direct-help panels are the only large Deep Blue surfaces. They combine a large typographic mark, a short invitation, plain explanatory copy, and a visible `mailto:` action. The homepage and every detail page end with this human route. + +### Accessibility Behavior + +Pages use a skip link, semantic landmarks, one route-level H1, descriptive image alternatives, visible focus, minimum 44px targets, reduced-motion support, and forced-colors borders for photographs, help panels, and primary actions. Decorative numbers, annotations, and marks are hidden from assistive technology when they repeat adjacent meaning. + +## Do's and Don'ts + +### Do: + +- **Do** lead with real educators, teaching moments, and clear outcomes before implementation detail. +- **Do** preserve the three numbered routes and their blue, coral, and yellow assignments. +- **Do** use ruled paper, captions, modest rotation, and close shadows as one coherent editorial material vocabulary. +- **Do** keep English and Spanish structurally equivalent, concise, and page-preserving. +- **Do** make direct help visible and keep GitHub actions on individual product pages only. +- **Do** retain the skip link, visible focus, 44px targets, meaningful alternative text, reduced motion, and forced-colors fallbacks. + +### Don't: + +- **Don't** turn the experience into a generic SaaS hero, rounded feature-card grid, or technical dashboard aesthetic. +- **Don't** use robots, holograms, dark technology imagery, abstract AI symbols, or fabricated product screenshots in place of human education photography. +- **Don't** add gradients that imply technology, glassmorphism, neon, or unrelated accent colors. +- **Don't** use Unicode glyphs as a substitute for authored or library icons. +- **Don't** expose GitHub in global navigation, way pages, or the homepage. +- **Don't** add testimonials, logos, metrics, or claims without approved evidence. +- **Don't** canonize the legacy kraft-board, brass-pin, stencil-type, or hand-crank “Learning Automata” vocabulary; it is not present in the shipped interface. diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 0000000..64b72bc --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,62 @@ +# Product + + + +## Platform + +web + +## Users + +The primary audience is educators and people responsible for Moodle sites or learning environments. They visit the website to understand what MoodlIA offers, identify the way of working that matches their needs, and decide whether to explore further or ask for help. + +## Product Purpose + +MoodlIA presents a family of projects that help people connect Moodle with AI, improve teaching workflows, and understand course activity. The website should make the ecosystem understandable without requiring technical knowledge and provide a direct route to support. + +## Positioning + +MoodlIA brings independent but related Moodle projects together as three practical ways to move forward, while offering direct help to anyone who wants to choose, use, troubleshoot, or shape something related to MoodlIA. + +## Operating Context + +Visitors may be evaluating tools before installation, looking for a specific teaching workflow, exploring Moodle and AI integration, or seeking help with an existing MoodlIA project. Project development and issue tracking take place through the MoodlIA GitHub repositories. + +## Capabilities and Constraints + +- The ecosystem is organized around three ways to move forward: work with AI, teach with confidence, and understand what matters. +- AI integration includes the MoodlIA Moodle plugin, MoodlIA CLI, Moodle Core CLI, and MoodlIA Skills. +- Teaching tools include MoodlIA Rubrics, MoodlIA Corrector, MoodlIA Backup Converter, and related Chrome extensions. +- Insights include the MoodlIA Teacher Dashboard and MoodlIA Analyzer applications. +- The home page introduces the three ways. Each way and product has a dedicated page. +- Every public page is available in English and Spanish through equivalent localized routes. +- GitHub is mentioned and linked only on individual product pages. +- The contact address is `contact@moodlia.com`. +- The website must remain compatible with the existing vinext static-export workflow. + +## Brand Commitments + +- Preserve the MoodlIA name and its capitalization. +- Make the number three a recognizable part of the story because it represents the three ways MoodlIA helps. +- Use clear, confident, non-technical language. +- Communicate that help is available for anything related to MoodlIA. + +## Evidence on Hand + +- Existing project names and descriptions in `app/page.tsx`. +- Four commissioned editorial education images in `public/moodlia-ai-companion-v2.jpg`, `public/moodlia-teaching-flow-v2.jpg`, `public/moodlia-learning-clarity-v2.jpg`, and `public/moodlia-educators-together-v2.jpg`. +- Existing legacy social preview artwork remains available, but the current metadata uses the new educators image. +- No approved testimonials, customer logos, usage statistics, or case studies are currently available; future design work must not fabricate them. + +## Product Principles + +- Explain the ecosystem before exposing implementation detail. +- Give each of the three ways equal strategic importance. +- Make the next action obvious: explore a way forward or ask for help. +- Prefer real project facts over generic claims. +- Keep the experience useful and understandable across desktop and mobile. +- Keep English and Spanish content equally complete, with page-preserving language switches and localized SEO metadata. + +## Accessibility & Inclusion + +The site must use semantic landmarks, visible keyboard focus, reduced-motion support, meaningful alternative text, and touch targets suitable for mobile users. diff --git a/app/catalog.ts b/app/catalog.ts new file mode 100644 index 0000000..5f1ff16 --- /dev/null +++ b/app/catalog.ts @@ -0,0 +1,566 @@ +export type WaySlug = "ai-integration" | "teaching-tools" | "learning-insights"; + +export interface MoodliaWay { + slug: WaySlug; + number: string; + title: string; + shortTitle: string; + description: string; + introduction: string; + image: string; + imageAlt: string; + imageCaption: string; + outcomes: string[]; + productSlugs: string[]; +} + +export interface MoodliaProduct { + slug: string; + name: string; + waySlug: WaySlug; + kind: string; + status: string; + description: string; + introduction: string; + highlights: string[]; + bestFor: string[]; + requirements: string[]; + startGuide: { + install: string[]; + firstUse: string[]; + adminNote: string; + }; + sourceUrl: string; + sourceLabel: string; + secondaryUrl?: string; + secondaryLabel?: string; +} + +export const ways: MoodliaWay[] = [ + { + slug: "ai-integration", + number: "1", + title: "Turn ideas into Moodle learning", + shortTitle: "Plan with AI", + description: "Shape a course, activity, or improvement with AI support—then decide what reaches Moodle.", + introduction: + "Practical ways to turn a teaching idea into Moodle content, with your Moodle site, permissions, and professional judgement staying in charge.", + image: "/moodlia-ai-companion-v2.jpg", + imageAlt: "An educator planning a course with lesson notes and a laptop in a bright learning space", + imageCaption: "AI that supports the way you already teach", + outcomes: [ + "Prepare and improve Moodle content without starting every task from a blank page.", + "Use the AI assistant or workflow that fits your school and your way of working.", + "Review each proposed change before it becomes part of a live course.", + ], + productSlugs: ["moodle-plugin", "cli", "moodle-core-cli", "skills"], + }, + { + slug: "teaching-tools", + number: "2", + title: "Spend more time teaching", + shortTitle: "Teach with ease", + description: "Prepare rubrics, review work, and give useful feedback with less repetitive effort.", + introduction: + "Focused tools that help with the parts of Moodle teaching that take the most time, while every teaching and grading decision remains yours.", + image: "/moodlia-teaching-flow-v2.jpg", + imageAlt: "An educator calmly reviewing student work and feedback cards", + imageCaption: "More time for thoughtful teaching", + outcomes: [ + "Bring a complete rubric into Moodle instead of entering every level by hand.", + "Use feedback suggestions as a starting point, then approve only what you mean.", + "Move a course backup to an older Moodle site without sending it to a server.", + ], + productSlugs: ["rubrics", "corrector", "backup-converter", "chrome-extensions"], + }, + { + slug: "learning-insights", + number: "3", + title: "Know where to help next", + shortTitle: "See what matters", + description: "Turn course activity into clear priorities so support arrives at the right time.", + introduction: + "Clear course views that bring together activity, deadlines, participation, and progress, so the next helpful conversation is easier to spot.", + image: "/moodlia-learning-clarity-v2.jpg", + imageAlt: "An educator reviewing a simple learning overview and three priority markers", + imageCaption: "Clarity for the next helpful decision", + outcomes: [ + "See the courses, deadlines, and resources that need attention in one place.", + "Notice participation and progress patterns worth following up with care.", + "Choose the simple overview or a deeper analysis when you need it.", + ], + productSlugs: ["teacher-dashboard", "analyzer-web", "analyzer-desktop"], + }, +]; + +export const products: MoodliaProduct[] = [ + { + slug: "moodle-plugin", + name: "MoodlIA Moodle Plugin", + waySlug: "ai-integration", + kind: "Moodle local plugin", + status: "Open-source project", + description: "Gives trusted AI tools controlled access to Moodle actions and content.", + introduction: + "The server-side foundation for controlled Moodle automation. It exposes explicit operations through REST and a Moodle-hosted MCP endpoint while keeping Moodle permissions and records authoritative.", + highlights: [ + "REST services and a Moodle-hosted MCP endpoint", + "Operations for courses, activities, question banks, enrolments, files, audits, and backups", + "Permission-aware workflows that do not bypass Moodle", + ], + bestFor: [ + "Teams connecting AI assistants directly to Moodle", + "Administrators automating repeated course-building work", + "Developers building controlled Moodle workflows", + ], + requirements: [ + "A Moodle site where a local plugin can be installed", + "An authorised Moodle service user and token", + "Only the permissions required by the intended workflow", + ], + startGuide: { + install: [ + "Ask the person who manages your Moodle site to install this plugin once for the site.", + "Ask them to create a separate, limited MoodlIA service account and token for the work you need.", + "Keep the Moodle address and token private; do not share an administrator password.", + ], + firstUse: [ + "Start with a small task in a copied or test course.", + "Use it through a companion tool such as MoodlIA CLI or an approved AI assistant.", + "Review each proposed Moodle change before confirming it.", + ], + adminNote: "This is the foundation installed by a Moodle administrator. Teachers normally use it through another MoodlIA tool.", + }, + sourceUrl: "https://github.com/gafapa/moodle-local_moodlia", + sourceLabel: "View the plugin on GitHub", + secondaryUrl: "https://github.com/gafapa/moodle-local_moodlia/issues", + secondaryLabel: "Report or follow an issue", + }, + { + slug: "cli", + name: "MoodlIA CLI", + waySlug: "ai-integration", + kind: "Command-line and Node client", + status: "Published npm package", + description: "Runs Moodle tasks from a terminal or repeatable workflow.", + introduction: + "The public command-line tool and reusable Node client for the MoodlIA Moodle Plugin. It brings the same operation contract to developer machines, scripts, and automation workers.", + highlights: [ + "Connects directly to MoodlIA through REST", + "Available as a global command or project dependency", + "Includes a reusable client and generated TypeScript declarations", + ], + bestFor: [ + "People who prefer a terminal for repeatable Moodle work", + "Scripts that build, inspect, or audit course content", + "Automation workers that need the public MoodlIA client", + ], + requirements: [ + "Node.js 22 or later", + "A Moodle site with the MoodlIA plugin installed", + "A REST token enabled for the MoodlIA service", + ], + startGuide: { + install: [ + "Ask a colleague who is comfortable with command-line tools to install MoodlIA CLI on the computer you will use.", + "Give them the Moodle address and a dedicated MoodlIA REST token supplied by your Moodle administrator.", + "Keep that token private and use a test course for your first connection.", + ], + firstUse: [ + "Open the command tool and check that it can read your Moodle site.", + "Try one small, reversible task, such as listing a course or creating a draft item.", + "Check the result in Moodle before repeating the workflow.", + ], + adminNote: "This is a terminal tool. You do not need to learn it alone: your Moodle or IT colleague can complete the one-time setup with you.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-cli", + sourceLabel: "View the CLI on GitHub", + secondaryUrl: "https://www.npmjs.com/package/moodlia", + secondaryLabel: "Open the npm package", + }, + { + slug: "moodle-core-cli", + name: "Moodle Core CLI", + waySlug: "ai-integration", + kind: "Command-line and Node client", + status: "Published npm package", + description: "Works with Moodle's standard web services without installing a plugin.", + introduction: + "A friendly client and command-line interface for Moodle 5.0 and later core web services. It turns complex REST details into stable operations without requiring the MoodlIA plugin.", + highlights: [ + "Uses Moodle core web services only", + "Handles nested parameters, version checks, and response normalisation", + "Exposes friendly operations instead of arbitrary remote calls", + ], + bestFor: [ + "Moodle sites that cannot install an additional plugin", + "Developers who want a typed client for core services", + "Controlled automation using standard Moodle capabilities", + ], + requirements: [ + "Node.js 22 or later", + "Moodle 5.0 or later with REST web services enabled", + "A token whose service exposes each required Moodle function", + ], + startGuide: { + install: [ + "Ask your Moodle administrator to enable the standard REST services needed for your task.", + "Ask a colleague who uses command-line tools to install Moodle Core CLI on your computer.", + "Use a dedicated token with only the Moodle functions you need.", + ], + firstUse: [ + "First confirm that the tool can read your Moodle site.", + "Try a small task in a test course before changing a live course.", + "Review the Moodle result after every new workflow.", + ], + adminNote: "This option is useful when your Moodle site cannot install the MoodlIA plugin. It still needs a Moodle administrator to prepare access safely.", + }, + sourceUrl: "https://github.com/gafapa/moodle-core-cli", + sourceLabel: "View Moodle Core CLI on GitHub", + secondaryUrl: "https://www.npmjs.com/package/moodle-core-cli", + secondaryLabel: "Open the npm package", + }, + { + slug: "skills", + name: "MoodlIA Skills", + waySlug: "ai-integration", + kind: "Reusable AI-agent skills", + status: "Open-source project", + description: "Guides AI assistants when creating and managing Moodle content.", + introduction: + "A reusable set of Codex skills for operating Moodle through MoodlIA and designing accessible content that remains portable through normal Moodle backup and restore workflows.", + highlights: [ + "Guidance for inspecting, creating, updating, publishing, and verifying Moodle entities", + "Portable HTML and interactive content designed for normal Moodle workflows", + "Validation against unsafe or remotely dependent content packages", + ], + bestFor: [ + "Educators working with an AI assistant on Moodle content", + "Teams that need repeatable, documented agent behaviour", + "Course content that must remain portable without MoodlIA at runtime", + ], + requirements: [ + "Codex or a compatible environment that can load reusable skills", + "Public MoodlIA interfaces for Moodle operations", + ], + startGuide: { + install: [ + "Choose an AI workspace that can use reusable skills, such as Codex.", + "Ask the person who manages that workspace to add the MoodlIA Skills collection.", + "Connect the workspace to Moodle only through an approved MoodlIA or Moodle Core setup.", + ], + firstUse: [ + "Tell the assistant what you want to prepare in plain language.", + "Start with a single page, section, or activity rather than a whole course.", + "Read the proposed content and approve it before it is published in Moodle.", + ], + adminNote: "Skills guide an AI assistant; they do not give it access on their own. Moodle access remains controlled by the connection you choose.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-skills", + sourceLabel: "View the skills on GitHub", + }, + { + slug: "rubrics", + name: "MoodlIA Rubrics", + waySlug: "teaching-tools", + kind: "Browser extension", + status: "Open-source project", + description: "Imports complete Moodle rubrics from a simple CSV file.", + introduction: + "A focused browser extension that turns a CSV rubric into Moodle's rubric editor, avoiding repetitive manual entry while leaving the rubric available for normal review and editing.", + highlights: [ + "Imports rubric criteria and levels from CSV", + "Runs only on supported or explicitly approved Moodle hosts", + "Uses a native CSV parser with no third-party runtime dependency", + ], + bestFor: [ + "Teachers preparing detailed Moodle grading rubrics", + "Teams moving existing rubric tables into Moodle", + "Repeated rubric setup across courses or sites", + ], + requirements: [ + "Chrome or another Chromium-based browser", + "Access to a Moodle rubric editing page", + "A correctly structured CSV rubric file", + ], + startGuide: { + install: [ + "Use Chrome or another Chromium-based browser.", + "Ask a colleague to add the MoodlIA Rubrics extension to the browser profile you use for Moodle.", + "Prepare your rubric in the simple CSV template before opening Moodle.", + ], + firstUse: [ + "Open the rubric editing page in Moodle.", + "Choose your CSV file and let the extension fill in the draft rubric.", + "Read and adjust the criteria in Moodle before saving the rubric.", + ], + adminNote: "The extension works inside the browser and does not replace Moodle's rubric editor. You remain in control of the final rubric.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-rubrics", + sourceLabel: "View MoodlIA Rubrics on GitHub", + }, + { + slug: "corrector", + name: "MoodlIA Corrector", + waySlug: "teaching-tools", + kind: "Chrome extension", + status: "Open-source project", + description: "Suggests assignment feedback and applies only teacher-approved corrections.", + introduction: + "A Chrome extension for reviewing Moodle assignment submissions with AI assistance. Suggestions remain under teacher control before they are applied to Moodle grading forms.", + highlights: [ + "Works on Moodle assignment grading pages", + "Normalises correction suggestions and rubric information", + "Requires teacher approval before applying suggested changes", + ], + bestFor: [ + "Teachers reviewing many Moodle assignment submissions", + "Rubric-based assessment with consistent feedback", + "Educators who want AI assistance without automatic grading decisions", + ], + requirements: [ + "Google Chrome 116 or later", + "Access to an HTTPS Moodle assignment grading page", + "A local Ollama service or an OpenAI-compatible provider approved by your school or team", + ], + startGuide: { + install: [ + "Install MoodlIA Corrector from the Chrome Web Store in your own Chrome profile.", + "Open the extension options and choose local Ollama or the OpenAI-compatible provider approved by your school or team.", + "Open Moodle normally with your own teacher account.", + ], + firstUse: [ + "Open one assignment submission in Moodle's grading page.", + "Ask for a suggestion and read it alongside the student's work and your rubric.", + "Only apply the parts you agree with, then save the grade in Moodle yourself.", + ], + adminNote: "Corrector suggests feedback; it does not make grading decisions for you. Nothing is applied until you approve it.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-corrector", + sourceLabel: "View MoodlIA Corrector on GitHub", + }, + { + slug: "backup-converter", + name: "MoodlIA Backup Converter", + waySlug: "teaching-tools", + kind: "Browser application", + status: "Open-source project", + description: "Adapts newer Moodle backups for selected older releases without uploading them.", + introduction: + "A local-first migration workbench for teachers and Moodle coordinators who need to reuse course material on an older site. It inspects a local .mbz file, explains compatibility risks, asks before removing unsupported activities, and prepares a converted backup entirely in the browser.", + highlights: [ + "Targets Moodle 4.5, 4.1, and 3.11 with explicit compatibility profiles", + "Keeps the source backup in the browser and never uploads it", + "Downloads both the converted .mbz file and an auditable JSON report", + ], + bestFor: [ + "Teachers moving courses between Moodle sites on different releases", + "Moodle coordinators preparing a working copy for a legacy site", + "Checking known incompatibilities before attempting a restore", + ], + requirements: [ + "A modern browser with enough memory for the expanded backup", + "A local Moodle .mbz backup no larger than 768 MB", + "A test course on the destination Moodle site for the first restore", + ], + startGuide: { + install: [ + "Open the static Backup Converter address provided by your school or team; there is nothing to install and no account to create.", + "Keep the original .mbz backup unchanged and work with a copy.", + "For a large backup, close other memory-intensive browser tabs before starting.", + ], + firstUse: [ + "Choose the local .mbz backup and the older Moodle release you need.", + "Read every blocker and approve removal only when you understand which activities will be omitted.", + "Download the converted backup and JSON report, then restore first into an empty test course.", + ], + adminNote: "Conversion is conservative and auditable, but it cannot guarantee that every Moodle plugin or newer question-bank structure will restore on an older site. Always test the result before relying on it.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-backup-converter", + sourceLabel: "View Backup Converter on GitHub", + secondaryUrl: "/tools/backup-converter/", + secondaryLabel: "Open Backup Converter", + }, + { + slug: "chrome-extensions", + name: "MoodlIA Chrome Extensions", + waySlug: "teaching-tools", + kind: "Browser-tool family", + status: "Project family", + description: "Bring focused MoodlIA tools into the Moodle pages teachers already use.", + introduction: + "The browser side of MoodlIA keeps each tool close to the Moodle task it supports. Extensions request only the site access they need and avoid replacing Moodle's own teaching workflow.", + highlights: [ + "Focused tools rather than one oversized browser extension", + "Host access limited to supported or teacher-approved Moodle sites", + "Current projects include MoodlIA Rubrics and MoodlIA Corrector", + ], + bestFor: [ + "Teachers who want help directly inside Moodle", + "Schools that prefer small, task-specific browser tools", + "Workflows where Moodle remains the visible place of work", + ], + requirements: [ + "Chrome or another supported Chromium-based browser", + "Permission to install the chosen extension", + "Access to the relevant Moodle editing or grading page", + ], + startGuide: { + install: [ + "Choose the one browser tool that matches your task: Rubrics for setup or Corrector for feedback.", + "Use Chrome or another supported Chromium-based browser.", + "Ask a colleague to add the chosen extension to your browser profile.", + ], + firstUse: [ + "Open the Moodle page where you normally prepare or grade work.", + "Use the extension for one small task first.", + "Check the result in Moodle before saving or applying it.", + ], + adminNote: "Each extension stays focused on one Moodle task. You can ask us which one fits your workflow before installing anything.", + }, + sourceUrl: "https://github.com/gafapa", + sourceLabel: "Explore MoodlIA projects on GitHub", + }, + { + slug: "teacher-dashboard", + name: "MoodlIA Teacher Dashboard", + waySlug: "learning-insights", + kind: "Browser dashboard", + status: "Open-source project", + description: "Brings courses, deadlines, resources, and direct links into one teacher view.", + introduction: + "A backend-free dashboard that connects directly to Moodle's REST services from the browser and organises the information teachers need for everyday course follow-up.", + highlights: [ + "Consolidates courses, action deadlines, resources, and Moodle links", + "Runs entirely in the browser without a custom backend", + "Stores connection settings locally on the device", + ], + bestFor: [ + "Teachers working across several Moodle courses", + "Quick daily checks of deadlines and course resources", + "Sites that allow browser access to Moodle REST services", + ], + requirements: [ + "Moodle REST web services enabled", + "A token with the required course and calendar functions", + "A Moodle site whose CORS policy allows browser requests", + ], + startGuide: { + install: [ + "Ask your Moodle administrator to prepare a REST token with course and calendar access.", + "Open the dashboard address provided by your school or team in a modern browser.", + "Enter the Moodle address and token on your own device; the dashboard keeps its settings locally.", + ], + firstUse: [ + "Check that your courses and deadlines appear correctly.", + "Open one course and use its direct Moodle links as you normally would.", + "Make the dashboard part of a short daily or weekly check-in.", + ], + adminNote: "The dashboard connects from your browser directly to Moodle. Your Moodle site must allow that connection before it can synchronise.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-teacher-dashboard", + sourceLabel: "View the dashboard on GitHub", + }, + { + slug: "analyzer-web", + name: "MoodlIA Analyzer Web", + waySlug: "learning-insights", + kind: "Browser application", + status: "Open-source project", + description: "Finds participation trends, student risk, and priorities in the browser.", + introduction: + "A frontend-only Moodle analysis workspace for course and student follow-up. It combines activity, participation, grades, risk, recommendations, and intervention priorities without a custom backend.", + highlights: [ + "Course-wide analysis, student risk, recommendations, and intervention queues", + "Trend comparisons, charts, filters, and CSV or JSON export", + "Local profiles and analysis cache stored in the browser", + ], + bestFor: [ + "Teachers who want deeper course analysis without installing desktop software", + "Student follow-up based on activity, participation, and grades", + "Bilingual English and Spanish analysis workflows", + ], + requirements: [ + "A modern web browser", + "Moodle REST access and a suitable token", + "Optional browser bridge when Moodle blocks direct cross-site requests", + ], + startGuide: { + install: [ + "Ask your Moodle administrator for a suitable REST token.", + "Open the Analyzer Web address provided by your school or team in a modern browser.", + "If the connection is blocked, ask a colleague to add the optional browser bridge.", + ], + firstUse: [ + "Connect to one course and wait for the analysis to finish.", + "Start with the course overview and the suggested priorities.", + "Open a student view only when you are ready to decide on a helpful follow-up.", + ], + adminNote: "Analyzer Web is for finding questions worth looking at, not for making automatic decisions about students.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-analyzer-web", + sourceLabel: "View Analyzer Web on GitHub", + }, + { + slug: "analyzer-desktop", + name: "MoodlIA Analyzer Desktop", + waySlug: "learning-insights", + kind: "Desktop application", + status: "Open-source project", + description: "Provides course analysis in a standalone desktop application.", + introduction: + "A standalone application for analysing Moodle course activity, engagement, grade trends, and follow-up risk, with course dashboards, student views, charts, and optional AI-assisted reports.", + highlights: [ + "Course dashboards and detailed student views", + "Configurable passing threshold and conservative risk classification", + "Local connection profiles with passwords kept only in memory", + ], + bestFor: [ + "Teachers who prefer a dedicated desktop workspace", + "Course and student analysis with extensive visual detail", + "Windows and Apple Silicon Mac workflows", + ], + requirements: [ + "A supported Windows or Apple Silicon Mac build", + "Access to Moodle REST web services", + "A token or credentials used to request one for the session", + ], + startGuide: { + install: [ + "Choose the Windows or Apple Silicon Mac version that matches your computer.", + "Download the approved desktop build or ask your school or team to install it for you.", + "Ask your Moodle administrator for the connection method approved by your site.", + ], + firstUse: [ + "Open the app and connect to Moodle for the current session.", + "Choose one course and begin with its overview rather than individual student details.", + "Use the analysis to guide a conversation or follow-up, then return to Moodle for the next action.", + ], + adminNote: "The desktop app keeps passwords only in memory for the active session. Use the connection method your Moodle site approves.", + }, + sourceUrl: "https://github.com/gafapa/moodlia-analyzer-desktop", + sourceLabel: "View Analyzer Desktop on GitHub", + secondaryUrl: "https://github.com/gafapa/moodlia-analyzer-desktop/actions", + secondaryLabel: "Open available builds", + }, +]; + +export function getWay(slug: string) { + return ways.find((way) => way.slug === slug); +} + +export function getProduct(slug: string) { + return products.find((product) => product.slug === slug); +} + +export function getWayProducts(waySlug: WaySlug) { + const way = getWay(waySlug); + if (!way) return []; + return way.productSlugs + .map((slug) => getProduct(slug)) + .filter((product): product is MoodliaProduct => Boolean(product)); +} + +export function getRelatedProducts(product: MoodliaProduct) { + return getWayProducts(product.waySlug).filter((candidate) => candidate.slug !== product.slug); +} diff --git a/app/cookies/page.tsx b/app/cookies/page.tsx new file mode 100644 index 0000000..9e3e8b6 --- /dev/null +++ b/app/cookies/page.tsx @@ -0,0 +1,7 @@ +import { createLegalMetadata, LegalPage } from "../legal-pages"; + +export const metadata = createLegalMetadata("cookies", "en"); + +export default function CookiesPage() { + return ; +} diff --git a/app/detail-pages.tsx b/app/detail-pages.tsx new file mode 100644 index 0000000..3a247c5 --- /dev/null +++ b/app/detail-pages.tsx @@ -0,0 +1,275 @@ +import type { Metadata } from "next"; +import Image from "next/image"; +import type { MoodliaProduct, MoodliaWay } from "./catalog"; +import { + getLocalizedRelatedProducts, + getLocalizedWay, + getLocalizedWayProducts, + getPracticalGuide, + interfaceCopy, + localizePath, + type Locale, +} from "./localization"; +import { SiteFooter, SiteHeader } from "./site-chrome"; + +const siteUrl = "https://moodlia.com"; + +function detailMetadata( + title: string, + description: string, + path: string, + image: string, + imageAlt: string, + locale: Locale, +): Metadata { + const absoluteImage = `${siteUrl}${image}`; + const fullTitle = `${title} | MoodlIA`; + const canonicalPath = localizePath(locale, path); + return { + title: fullTitle, + description, + alternates: { + canonical: canonicalPath, + languages: { en: path, es: localizePath("es", path), "x-default": path }, + }, + openGraph: { + title: fullTitle, + description, + url: `${siteUrl}${canonicalPath}`, + siteName: "MoodlIA", + locale: locale === "es" ? "es_ES" : "en_US", + type: "website", + images: [{ url: absoluteImage, width: 1120, height: 1400, alt: imageAlt }], + }, + twitter: { + card: "summary_large_image", + title: fullTitle, + description, + images: [absoluteImage], + }, + }; +} + +export function createWayMetadata(way: MoodliaWay, locale: Locale) { + return detailMetadata(way.shortTitle, way.introduction, `/ways/${way.slug}`, way.image, way.imageAlt, locale); +} + +export function createProductMetadata(product: MoodliaProduct, locale: Locale) { + const way = getLocalizedWay(product.waySlug, locale); + if (!way) throw new Error(`Missing way for ${product.slug}`); + return detailMetadata(product.name, product.description, `/products/${product.slug}`, way.image, `${product.name}: ${way.imageAlt}`, locale); +} + +function Breadcrumb({ locale, items }: { locale: Locale; items: Array<{ label: string; href?: string }> }) { + const copy = interfaceCopy[locale]; + return ( + + ); +} + +function DetailHelp({ subject, locale }: { subject: string; locale: Locale }) { + const copy = interfaceCopy[locale]; + return ( +
+

{copy.helpTitlePrefix} {subject}?

+

{copy.helpBody}

+ {copy.writeTo} + +
+ ); +} + +export function WayDetailPage({ way, locale }: { way: MoodliaWay; locale: Locale }) { + const copy = interfaceCopy[locale]; + const currentPath = `/ways/${way.slug}`; + const wayProducts = getLocalizedWayProducts(way.slug, locale); + const structuredData = { + "@context": "https://schema.org", + "@type": "CollectionPage", + name: `${way.shortTitle} | MoodlIA`, + url: `${siteUrl}${localizePath(locale, currentPath)}`, + description: way.introduction, + hasPart: wayProducts.map((product) => ({ + "@type": "SoftwareApplication", + name: product.name, + description: product.description, + url: `${siteUrl}${localizePath(locale, `/products/${product.slug}`)}`, + applicationCategory: "EducationalApplication", + })), + }; + + return ( + <> + {copy.skip} +