Skip to main content

New Commit: pagespeed update

Repository: Hestenb62/_legacy_backup

Author: Hesten Berger

Commit Message: pagespeed update

URL: https://github.com/Hestenb62/_legacy_backup/commit/0730251d8a552485e211925d44191f2ab849317d

Code Changes:

diff --git a/assets/css/components/mastery-modals.css b/assets/css/components/mastery-modals.css
index ba18ec1..c397b8a 100644
--- a/assets/css/components/mastery-modals.css
+++ b/assets/css/components/mastery-modals.css
@@ -29,18 +29,31 @@
   display: inline-flex;
   align-items: center;
   gap: 0.25rem;
-  font-size: 0.625rem;
-  font-weight: 700;
+  font-size: 0.6875rem;
+  font-weight: 800;
   text-transform: uppercase;
   letter-spacing: 0.08em;
-  color: var(--color-primary, #6366f1);
+  color: var(--color-primary-hover, #4338ca);
   margin-top: 0.375rem;
-  opacity: 0.85;
-  transition: opacity 0.2s, transform 0.2s;
+  opacity: 1;
+  transition: transform 0.2s, color 0.2s;
+}
+
+.stat-action-hint-emerald {
+  color: #047857;
+}
+
+.dark .stat-action-hint,
+.midnight .stat-action-hint {
+  color: #a5b4fc;
+}
+
+.dark .stat-action-hint-emerald,
+.midnight .stat-action-hint-emerald {
+  color: #34d399;
 }
 
 .stats-card-clickable:hover .stat-action-hint {
-  opacity: 1;
   transform: translateX(2px);
 }
 
diff --git a/assets/css/global-tokens.css b/assets/css/global-tokens.css
index 93c07c3..b24966c 100644
--- a/assets/css/global-tokens.css
+++ b/assets/css/global-tokens.css
@@ -20,7 +20,7 @@
 
     /* Typography Colors */
     --color-text-main: #0f172a;
-    --color-text-muted: #64748b;
+    --color-text-muted: #475569;
     --color-text-inverse: #ffffff;
 
     /* Compatibility Mappings */
diff --git a/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.orig.png b/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.orig.png
new file mode 100644
index 0000000..fe75db0
Binary files /dev/null and b/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.orig.png differ
diff --git a/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.png b/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.png
index fe75db0..f5b4c7a 100644
Binary files a/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.png and b/assets/images/6791421e-7ca7-40bd-83d3-06a479bf7f36.png differ
diff --git a/assets/js/index-main.js b/assets/js/index-main.js
index 8a88899..ce962bb 100644
--- a/assets/js/index-main.js
+++ b/assets/js/index-main.js
@@ -210,9 +210,9 @@ function renderLevels(data) {
                             onclick="speakCard(this, '${safeTitle}', '${safeDesc}')" aria-label="Listen to description">
                             <i class="fas fa-volume-up"></i>
                         </button>
-                        <a href="${level.link}" aria-label="Explore ${level.title}" class="level-open-btn">
+                        <a href="${level.link}" aria-label="Open ${level.title}" class="level-open-btn">
                             <span>Open</span>
-                            <i class="fas fa-arrow-right icon-sm"></i>
+                            <i class="fas fa-arrow-right icon-sm" aria-hidden="true"></i>
                         </a>
                     </div>
                 </div>
diff --git a/scratch/char_check.js b/scratch/char_check.js
new file mode 100644
index 0000000..afb9bab
--- /dev/null
+++ b/scratch/char_check.js
@@ -0,0 +1,10 @@
+const fs = require('fs');
+const file = 'C:\\Users\\Heste\\.gemini\\antigravity-ide\\brain\\ea681867-1e7b-4945-aee2-5b18fc10921b\\.system_generated\\steps\\216\\content.md';
+const content = fs.readFileSync(file, 'utf8');
+
+const marker = '"{\\n  \\"fetchTime\\":';
+const idx = content.indexOf(marker);
+
+for (let i = 967775; i <= 967795; i++) {
+    console.log(i, JSON.stringify(content[idx + i]));
+}
diff --git a/scratch/extract_lighthouse.js b/scratch/extract_lighthouse.js
new file mode 100644
index 0000000..89a11cb
--- /dev/null
+++ b/scratch/extract_lighthouse.js
@@ -0,0 +1,53 @@
+const fs = require('fs');
+const file = 'C:\\Users\\Heste\\.gemini\\antigravity-ide\\brain\\ea681867-1e7b-4945-aee2-5b18fc10921b\\.system_generated\\steps\\216\\content.md';
+const content = fs.readFileSync(file, 'utf8');
+
+const marker = '"{\\n  \\"fetchTime\\":';
+const idx = content.indexOf(marker);
+
+const rawSlice = content.slice(idx, idx + 967782);
+const unescaped = JSON.parse(rawSlice);
+const lhr = JSON.parse(unescaped);
+
+console.log('\n========================================');
+console.log('=== LIGHTHOUSE CATEGORIES (MOBILE) ===');
+console.log('========================================');
+for (const [k, v] of Object.entries(lhr.categories || {})) {
+    console.log(`${v.title}: ${Math.round(v.score * 100)} / 100`);
+}
+
+console.log('\n=== CORE METRICS ===');
+const metrics = [
+    'first-contentful-paint',
+    'largest-contentful-paint',
+    'total-blocking-time',
+    'cumulative-layout-shift',
+    'speed-index',
+    'interactive'
+];
+metrics.forEach(m => {
+    const a = lhr.audits[m];
+    if (a) {
+        console.log(`${a.title}: ${a.displayValue} (Score: ${Math.round(a.score * 100)})`);
+    }
+});
+
+console.log('\n=== ALL FAILED / OPPORTUNITY AUDITS (Score < 0.9) ===');
+for (const [id, a] of Object.entries(lhr.audits || {})) {
+    if (a.score !== null && a.score < 0.9 && a.scoreDisplayMode !== 'notApplicable' && a.scoreDisplayMode !== 'informative') {
+        console.log(`\n--------------------------------------------------`);
+        console.log(`[${id}] ${a.title}`);
+        console.log(`Score: ${Math.round(a.score * 100)} | Value: ${a.displayValue || 'N/A'}`);
+        if (a.description) console.log(`Description: ${a.description.replace(/\[Learn more\].*$/i, '').trim()}`);
+        if (a.details && a.details.items && a.details.items.length) {
+            console.log(`Offending items (${a.details.items.length}):`);
+            a.details.items.slice(0, 10).forEach(item => {
+                const url = item.url || item.node?.snippet || item.node?.selector || item.source || '';
+                const wastedMs = item.wastedMs ? `[wasted: ${item.wastedMs}ms]` : '';
+                const wastedBytes = item.wastedBytes ? `[wasted: ${Math.round(item.wastedBytes/1024)}KB]` : '';
+                const totalBytes = item.totalBytes ? `[total: ${Math.round(item.totalBytes/1024)}KB]` : '';
+                console.log(`  * ${url} ${wastedMs} ${wastedBytes} ${totalBytes}`);
+            });
+        }
+    }
+}
diff --git a/scratch/parse_pagespeed.js b/scratch/parse_pagespeed.js
new file mode 100644
index 0000000..3bd6015
--- /dev/null
+++ b/scratch/parse_pagespeed.js
@@ -0,0 +1,66 @@
+const fs = require('fs');
+const https = require('https');
+
+const reportFile = 'C:\\Users\\Heste\\.gemini\\antigravity-ide\\brain\\ea681867-1e7b-4945-aee2-5b18fc10921b\\.system_generated\\steps\\216\\content.md';
+
+try {
+    const raw = fs.readFileSync(reportFile, 'utf8');
+    // Search for Lighthouse JSON or audits
+    const auditMatch = raw.match(/\"lighthouseResult\"\s*:\s*(\{.+?\})\s*,\s*\"/);
+    if (auditMatch) {
+        console.log('Found lighthouseResult inside report HTML!');
+        const lhr = JSON.parse(auditMatch[1]);
+        printSummary(lhr);
+        process.exit(0);
+    }
+} catch (e) {
+    console.error('Error reading reportFile:', e.message);
+}
+
+// Alternatively, fetch live Google PageSpeed API for hestena62.com mobile
+console.log('Querying Google PageSpeed API for https://hestena62.com/ (mobile)...');
+const url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https%3A%2F%2Fhestena62.com%2F&strategy=mobile&category=performance&category=accessibility&category=best-practices&category=seo';
+
+https.get(url, (res) => {
+    let data = '';
+    res.on('data', chunk => data += chunk);
+    res.on('end', () => {
+        try {
+            const json = JSON.parse(data);
+            if (json.lighthouseResult) {
+                printSummary(json.lighthouseResult);
+            } else {
+                console.log('API returned without lighthouseResult:', json.error || data.slice(0, 500));
+            }
+        } catch (err) {
+            console.error('Failed to parse API response:', err.message);
+        }
+    });
+}).on('error', err => {
+    console.error('HTTPS error:', err.message);
+});
+
+function printSummary(lhr) {
+    console.log('\n=== LIGHTHOUSE CATEGORIES ===');
+    for (const [k, cat] of Object.entries(lhr.categories || {})) {
+        console.log(`${cat.title}: ${Math.round(cat.score * 100)} / 100`);
+    }
+
+    console.log('\n=== FAILED / OPPORTUNITY AUDITS ===');
+    const audits = lhr.audits || {};
+    for (const [id, audit] of Object.entries(audits)) {
+        if (audit.score !== null && audit.score < 0.9 && audit.scoreDisplayMode !== 'notApplicable' && audit.scoreDisplayMode !== 'informative') {
+            console.log(`\n[-] ${audit.title} (Score: ${Math.round(audit.score * 100)})`);
+            if (audit.displayValue) console.log(`    Value: ${audit.displayValue}`);
+            if (audit.description) console.log(`    Info: ${audit.description.slice(0, 150)}...`);
+            if (audit.details && audit.details.items && audit.details.items.length) {
+                const topItems = audit.details.items.slice(0, 5);
+                topItems.forEach(item => {
+                    const url = item.url || item.node?.snippet || item.source || JSON.stringify(item);
+                    const saving = item.wastedMs ? `${item.wastedMs}ms` : (item.wastedBytes ? `${Math.round(item.wastedBytes / 1024)}KB` : '');
+                    console.log(`      * ${url.slice(0, 100)} ${saving}`);
+                });
+            }
+        }
+    }
+}
diff --git a/scratch/print_a11y.js b/scratch/print_a11y.js
new file mode 100644
index 0000000..aed2a1b
--- /dev/null
+++ b/scratch/print_a11y.js
@@ -0,0 +1,25 @@
+const fs = require('fs');
+const file = 'C:\\Users\\Heste\\.gemini\\antigravity-ide\\brain\\ea681867-1e7b-4945-aee2-5b18fc10921b\\.system_generated\\steps\\216\\content.md';
+const content = fs.readFileSync(file, 'utf8');
+
+const marker = '"{\\n  \\"fetchTime\\":';
+const idx = content.indexOf(marker);
+
+const rawSlice = content.slice(idx, idx + 967782);
+const unescaped = JSON.parse(rawSlice);
+const lhr = JSON.parse(unescaped);
+
+const a11yAuditRefs = lhr.categories.accessibility?.auditRefs || [];
+console.log('=== FAILED A11Y AUDITS SUMMARY ===');
+a11yAuditRefs.forEach(ref => {
+    const a = lhr.audits[ref.id];
+    if (a && a.score !== null && a.score < 1) {
+        console.log(`[${ref.id}] (weight: ${ref.weight}) Score: ${a.score} | ${a.title}`);
+        if (a.details?.items) {
+            console.log(`  Items (${a.details.items.length}):`);
+            a.details.items.forEach(it => {
+                console.log(`    - ${it.node?.snippet || it.node?.selector || JSON.stringify(it)}`);
+            });
+        }
+    }
+});
diff --git a/scratch/print_all_issues.js b/scratch/print_all_issues.js
new file mode 100644
index 0000000..46f4f80
--- /dev/null
+++ b/scratch/print_all_issues.js
@@ -0,0 +1,63 @@
+const fs = require('fs');
+const file = 'C:\\Users\\Heste\\.gemini\\antigravity-ide\\brain\\ea681867-1e7b-4945-aee2-5b18fc10921b\\.system_generated\\steps\\216\\content.md';
+const content = fs.readFileSync(file, 'utf8');
+
+const marker = '"{\\n  \\"fetchTime\\":';
+const idx = content.indexOf(marker);
+
+const rawSlice = content.slice(idx, idx + 967782);
+const unescaped = JSON.parse(rawSlice);
+const lhr = JSON.parse(unescaped);
+
+console.log('=== DETAILED ISSUES BY CATEGORY ===');
+
+// Check Accessibility audits that failed
+console.log('\n--- ACCESSIBILITY ISSUES ---');
+const a11yAuditRefs = lhr.categories.accessibility?.auditRefs || [];
+a11yAuditRefs.forEach(ref => {
+    const a = lhr.audits[ref.id];
+    if (a && a.score !== null && a.score < 1) {
+        console.log(`[${ref.id}] (weight: ${ref.weight}) ${a.title}: ${a.score}`);
+        if (a.explanation) console.log(`  Explanation: ${a.explanation}`);
+        if (a.details?.items) {
+            a.details.items.forEach(it => {
+                console.log(`  - snippet: ${it.node?.snippet || ''} | selector: ${it.node?.selector || ''} | explanation: ${it.node?.explanation || ''}`);
+            });
+        }
+    }
+});
+
+// Check SEO audits that failed
+console.log('\n--- SEO ISSUES ---');
+const seoAuditRefs = lhr.categories.seo?.auditRefs || [];
+seoAuditRefs.forEach(ref => {
+    const a = lhr.audits[ref.id];
+    if (a && a.score !== null && a.score < 1) {
+        console.log(`[${ref.id}] (weight: ${ref.weight}) ${a.title}: ${a.score}`);
+        if (a.explanation) console.log(`  Explanation: ${a.explanation}`);
+        if (a.details?.items) {

Popular Posts

New Commit: fixed theme issues

Repository: Hestenb62/_legacy_backup Author: Hesten Berger Commit Message: fixed theme issues URL: https://github.com/Hestenb62/_legacy_backup/commit/498741f8c633ecaf6e7e594bb0aed02c47e69b39 Code Changes: diff --git a/assessment/index.php b/assessment/index.php index 822865b..5e8b706 100644 --- a/assessment/index.php +++ b/assessment/index.php @@ -264,7 +264,7 @@ include '../src/header.php'; </div> <!-- Hint Modal (Inline) --> - <div id="hintText" class="hint-box" style="display: none;"> + <div id="hintText" class="hint-box hidden"> <strong>Hint:</strong> <span id="hint-content"></span> </div> </div> diff --git a/assets/css/pages/assessment.css b/assets/css/pages/assessment.css index b57e964..7eb0d74 100644 --- a/assets/c...

New Commit: added arura mesh

Repository: Hestenb62/_legacy_backup Author: Hesten Berger Commit Message: added arura mesh URL: https://github.com/Hestenb62/_legacy_backup/commit/d8a9c63f2df943f6e40651985fb1c273c5809dd4 Code Changes: diff --git a/assets/css/level-style.css b/assets/css/level-style.css index ed8b60b..49cddf7 100644 --- a/assets/css/level-style.css +++ b/assets/css/level-style.css @@ -100,6 +100,8 @@ h1, h2, h3, h4 { padding: 4rem 1rem 3rem 1rem; background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%); border-bottom: 1px solid var(--glass-border); + position: relative; + overflow: hidden; } .hero-inner { @@ -111,6 +113,78 @@ h1, h2, h3, h4 { flex-wrap: wrap; gap: 1.5rem; animation: fadeUp 0.6s ease-out; + position: relative; + z-index: 2; +} + +/* Aurora Mesh Background for Level Hero */ +.level-aurora-bg { + position: absolute; + inset: 0; + overflow: hidden; + pointer-events: none; + z-index: 1; +} + +....

New Commit: Add JSON lesson migration and renderer scaffold Introduces a first-pass migration pipeline from PHP lesson files to structured JSON with `migrate_lessons.php`, and adds a generated `assets/data/lessons.json` catalog containing extracted metadata plus manual-migration placeholders for complex interactive content. Adds a new universal `src/lesson_renderer.php` to render lessons from JSON, along with initial component templates (`interactive-ladder` and `teacher-concepts`) for modular block rendering. Also includes `audit_report.html` documenting current security, accessibility, and architecture findings that motivated the move toward a template-driven lesson system.

Repository: Hestenb62/_legacy_backup Author: Hesten Berger Commit Message: Add JSON lesson migration and renderer scaffold Introduces a first-pass migration pipeline from PHP lesson files to structured JSON with , and adds a generated catalog containing extracted metadata plus manual-migration placeholders for complex interactive content. Adds a new universal to render lessons from JSON, along with initial component templates ( and ) for modular block rendering. Also includes documenting current security, accessibility, and architecture findings that motivated the move toward a template-driven lesson system. URL: https://github.com/Hestenb62/_legacy_backup/commit/f0c974b613ed65b7edcb712abb88bfae61ef0df5 Code Changes: diff --git a/assets/data/lessons.json b/assets/data/lessons.json new file mode 100644 index 0000000..0389666 --- /dev/null +++ b/assets/data/lessons.json @@ -0,0 +1,2835 @@ +{ + "lessons": { + "k-ela-m1-a-1": { + ...