docs: migrate GitHub Pages to static HTML with eggspot.app branding#99
docs: migrate GitHub Pages to static HTML with eggspot.app branding#99cloud-hai-vo merged 1 commit intomainfrom
Conversation
…ot.app branding Replace Jekyll/Markdown docs with hand-authored static HTML: - New eggspot.css with brand colors (#FAB400 yellow, #5956E9 purple, dark bg) - Rich landing page: hero, stats bar, feature cards, benchmark table, install banner - 13 content pages + 7 diagnostic pages, all with shared sidebar nav and responsive layout - Remove Jekyll config, _config.yml, _includes/, all .md sources, .nojekyll added - Update pages.yml workflow to deploy static files directly (no Jekyll build step) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Migrates the project docs site from Jekyll/Markdown to a dependency-free static HTML site under the eggspot.app brand, and updates GitHub Pages deployment to publish the static docs/ directory directly.
Changes:
- Replaces Markdown/Jekyll docs with static HTML pages (including diagnostics pages) using a shared sidebar/header layout.
- Adds shared site styling (
eggspot.css) and navigation behavior (nav.js) for responsive sidebar + copy button. - Simplifies
.github/workflows/pages.ymlto upload and deploy static files; adds.nojekyllto disable Jekyll.
Reviewed changes
Copilot reviewed 48 out of 49 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| .github/workflows/pages.yml | Switches Pages deploy from Jekyll build to uploading docs/ as a static artifact. |
| docs/.nojekyll | Disables Jekyll processing for static HTML publishing. |
| docs/assets/css/eggspot.css | Adds the eggspot.app-branded global stylesheet and layout primitives. |
| docs/assets/js/nav.js | Adds mobile sidebar toggle, active-link highlighting, and copy-to-clipboard behavior. |
| docs/index.md | Removes Jekyll Markdown home page. |
| docs/index.html | Adds new branded static home/landing page. |
| docs/quick-start.md | Removes Jekyll Markdown quick start page. |
| docs/quick-start.html | Adds static quick start page. |
| docs/vs-automapper.md | Removes Jekyll Markdown comparison page. |
| docs/vs-automapper.html | Adds static “vs AutoMapper” page. |
| docs/Configuration.md | Removes Jekyll Markdown configuration page. |
| docs/Configuration.html | Adds static configuration page. |
| docs/Getting-Started.md | Removes Jekyll Markdown getting-started page. |
| docs/Getting-Started.html | Adds static getting-started page. |
| docs/Dependency-Injection.md | Removes Jekyll Markdown DI page. |
| docs/Dependency-Injection.html | Adds static DI page. |
| docs/Profiles.md | Removes Jekyll Markdown profiles page. |
| docs/Profiles.html | Adds static profiles page. |
| docs/Advanced-Features.md | Removes Jekyll Markdown advanced-features page. |
| docs/Advanced-Features.html | Adds static advanced-features page. |
| docs/Performance.md | Removes Jekyll Markdown performance page. |
| docs/Performance.html | Adds static performance page. |
| docs/API-Reference.md | Removes Jekyll Markdown API reference. |
| docs/API-Reference.html | Adds static API reference page. |
| docs/Migration-Guide.md | Removes Jekyll Markdown migration guide. |
| docs/Migration-Guide.html | Adds static migration guide page. |
| docs/code-generation.md | Removes Jekyll Markdown code generation index page. |
| docs/Tier2-Getting-Started.md | Removes Jekyll Markdown Tier 2 page. |
| docs/Tier2-Getting-Started.html | Adds static Tier 2 page. |
| docs/Tier3-Getting-Started.md | Removes Jekyll Markdown Tier 3 page. |
| docs/Tier3-Getting-Started.html | Adds static Tier 3 page. |
| docs/guide.md | Removes Jekyll Markdown “Guide” landing page. |
| docs/diagnostics/EGG1002.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG1002.html | Adds static diagnostics page. |
| docs/diagnostics/EGG1003.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG1003.html | Adds static diagnostics page. |
| docs/diagnostics/EGG2001.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG2001.html | Adds static diagnostics page. |
| docs/diagnostics/EGG2002.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG2002.html | Adds static diagnostics page. |
| docs/diagnostics/EGG3001.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG3001.html | Adds static diagnostics page. |
| docs/diagnostics/EGG3002.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG3002.html | Adds static diagnostics page. |
| docs/diagnostics/EGG3003.md | Removes Jekyll Markdown diagnostics page. |
| docs/diagnostics/EGG3003.html | Adds static diagnostics page. |
| docs/_config.yml | Removes Jekyll configuration. |
| docs/_includes/head_custom.html | Removes Jekyll theme customization include. |
| /* Copy buttons */ | ||
| document.querySelectorAll('.copy-btn').forEach(function (btn) { | ||
| btn.addEventListener('click', function () { | ||
| var cmd = btn.previousElementSibling; | ||
| if (!cmd) return; | ||
| navigator.clipboard.writeText(cmd.textContent.trim()).then(function () { | ||
| btn.textContent = 'Copied!'; | ||
| setTimeout(function () { btn.textContent = 'Copy'; }, 1600); |
There was a problem hiding this comment.
The copy-to-clipboard handler assumes navigator.clipboard.writeText is available and succeeds. In browsers/environments where Clipboard API is unavailable or permission is denied, this will throw/reject and the button gives no feedback. Consider feature-detecting navigator.clipboard?.writeText and adding a .catch(...) fallback (e.g., select+execCommand or a brief error state).
| /* Copy buttons */ | |
| document.querySelectorAll('.copy-btn').forEach(function (btn) { | |
| btn.addEventListener('click', function () { | |
| var cmd = btn.previousElementSibling; | |
| if (!cmd) return; | |
| navigator.clipboard.writeText(cmd.textContent.trim()).then(function () { | |
| btn.textContent = 'Copied!'; | |
| setTimeout(function () { btn.textContent = 'Copy'; }, 1600); | |
| function setCopyButtonState(btn, text) { | |
| btn.textContent = text; | |
| setTimeout(function () { btn.textContent = 'Copy'; }, 1600); | |
| } | |
| function fallbackCopyText(text) { | |
| var textarea = document.createElement('textarea'); | |
| textarea.value = text; | |
| textarea.setAttribute('readonly', ''); | |
| textarea.style.position = 'absolute'; | |
| textarea.style.left = '-9999px'; | |
| document.body.appendChild(textarea); | |
| textarea.select(); | |
| textarea.setSelectionRange(0, textarea.value.length); | |
| try { | |
| return document.execCommand('copy'); | |
| } finally { | |
| document.body.removeChild(textarea); | |
| } | |
| } | |
| function copyText(text) { | |
| if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') { | |
| return navigator.clipboard.writeText(text).catch(function () { | |
| if (fallbackCopyText(text)) return; | |
| throw new Error('Copy failed'); | |
| }); | |
| } | |
| return fallbackCopyText(text) ? Promise.resolve() : Promise.reject(new Error('Copy failed')); | |
| } | |
| /* Copy buttons */ | |
| document.querySelectorAll('.copy-btn').forEach(function (btn) { | |
| btn.addEventListener('click', function () { | |
| var cmd = btn.previousElementSibling; | |
| if (!cmd) return; | |
| copyText(cmd.textContent.trim()).then(function () { | |
| setCopyButtonState(btn, 'Copied!'); | |
| }).catch(function () { | |
| setCopyButtonState(btn, 'Copy failed'); |
| transition: color var(--ease), background var(--ease), border-color var(--ease); | ||
| } | ||
| .nav-link:hover { color: var(--text); background: var(--yellow-dim); } | ||
| .nav-link.active { |
There was a problem hiding this comment.
Some generated pages include a nav-link-active class (e.g., Performance.html, API-Reference.html), but the stylesheet only styles .nav-link.active. Either remove nav-link-active from the HTML or add a CSS alias so it produces the intended active styling.
| .nav-link.active { | |
| .nav-link.active, | |
| .nav-link.nav-link-active { |
📊 Benchmark Results
🔵 Flat Mapping — 10-property object
🟡 Flattening — 2 nested objects → 8 flat properties
🟣 Deep Mapping — 2 nested address objects
🟢 Complex Mapping — nested object + collection
🟠 Collection — 100-item
|
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Manual | 1.967 μs | 2.0978 μs | 0.1150 μs | 1.877 μs | 1.926 μs | 2.096 μs | 1.00 | 0.07 | 1 | 0.5264 | 0.0153 | 8.65 KB | 1.00 |
| EggMapper | 2.032 μs | 0.2733 μs | 0.0150 μs | 2.023 μs | 2.024 μs | 2.049 μs | 1.04 | 0.05 | 1 | 0.5264 | 0.0153 | 8.65 KB | 1.00 |
| AutoMapper | 2.700 μs | 2.0945 μs | 0.1148 μs | 2.634 μs | 2.634 μs | 2.833 μs | 1.38 | 0.08 | 2 | 0.6065 | 0.0191 | 9.95 KB | 1.15 |
| Mapster | 2.092 μs | 1.9255 μs | 0.1055 μs | 1.971 μs | 2.142 μs | 2.163 μs | 1.07 | 0.07 | 1 | 0.5264 | 0.0153 | 8.65 KB | 1.00 |
| MapperlyMap | 2.157 μs | 0.5652 μs | 0.0310 μs | 2.136 μs | 2.143 μs | 2.193 μs | 1.10 | 0.06 | 1 | 0.5264 | 0.0153 | 8.65 KB | 1.00 |
| AgileMapper | 2.734 μs | 0.4915 μs | 0.0269 μs | 2.706 μs | 2.738 μs | 2.760 μs | 1.39 | 0.07 | 2 | 0.5417 | 0.0153 | 8.91 KB | 1.03 |
🟠 Collection — 100-item List<T>
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Manual | 6.302 μs | 2.537 μs | 0.1391 μs | 6.150 μs | 6.332 μs | 6.423 μs | 1.00 | 0.03 | 1 | 1.6708 | 0.0916 | 27.4 KB | 1.00 |
| EggMapper | 6.757 μs | 1.949 μs | 0.1068 μs | 6.641 μs | 6.779 μs | 6.852 μs | 1.07 | 0.03 | 1 | 1.6708 | 0.0916 | 27.4 KB | 1.00 |
| AutoMapper | 8.090 μs | 1.886 μs | 0.1034 μs | 7.977 μs | 8.114 μs | 8.179 μs | 1.28 | 0.03 | 1 | 1.7548 | 0.1068 | 28.7 KB | 1.05 |
| Mapster | 6.841 μs | 2.065 μs | 0.1132 μs | 6.711 μs | 6.892 μs | 6.919 μs | 1.09 | 0.03 | 1 | 1.6708 | 0.0916 | 27.4 KB | 1.00 |
| MapperlyMap | 6.210 μs | 1.309 μs | 0.0718 μs | 6.127 μs | 6.249 μs | 6.254 μs | 0.99 | 0.02 | 1 | 1.6785 | 0.0992 | 27.42 KB | 1.00 |
| AgileMapper | 6.383 μs | 1.193 μs | 0.0654 μs | 6.334 μs | 6.357 μs | 6.457 μs | 1.01 | 0.02 | 1 | 1.0223 | 0.0610 | 16.72 KB | 0.61 |
🟠 Collection — 100-item List<T>
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Manual | 22.64 μs | 6.776 μs | 0.371 μs | 22.21 μs | 22.84 μs | 22.86 μs | 1.00 | 0.02 | 1 | 5.2490 | 1.3123 | 85.99 KB | 1.00 |
| EggMapper | 21.67 μs | 15.600 μs | 0.855 μs | 20.91 μs | 21.50 μs | 22.59 μs | 0.96 | 0.04 | 1 | 5.2490 | 1.3123 | 85.99 KB | 1.00 |
| AutoMapper | 27.93 μs | 1.112 μs | 0.061 μs | 27.87 μs | 27.93 μs | 27.99 μs | 1.23 | 0.02 | 1 | 5.7678 | 1.4343 | 94.34 KB | 1.10 |
| Mapster | 21.64 μs | 2.210 μs | 0.121 μs | 21.52 μs | 21.64 μs | 21.76 μs | 0.96 | 0.01 | 1 | 5.2490 | 1.3123 | 85.99 KB | 1.00 |
| MapperlyMap | 23.09 μs | 21.010 μs | 1.152 μs | 21.77 μs | 23.65 μs | 23.87 μs | 1.02 | 0.05 | 1 | 5.2490 | 1.2817 | 86.02 KB | 1.00 |
| AgileMapper | 23.29 μs | 7.307 μs | 0.401 μs | 22.85 μs | 23.37 μs | 23.64 μs | 1.03 | 0.02 | 1 | 5.2795 | 1.3123 | 86.25 KB | 1.00 |
⚪ Startup / Configuration time
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EggMapperStartup | 1,344.673 μs | 1,910.554 μs | 104.7239 μs | 1,226.118 μs | 1,383.322 μs | 1,424.580 μs | 1.004 | 0.10 | 3 | 5.8594 | 3.9063 | 95.67 KB | 1.00 |
| AutoMapperStartup | 387.295 μs | 901.687 μs | 49.4245 μs | 335.178 μs | 393.211 μs | 433.495 μs | 0.289 | 0.04 | 2 | 5.8594 | - | 104.01 KB | 1.09 |
| MapsterStartup | 2.660 μs | 1.099 μs | 0.0602 μs | 2.623 μs | 2.628 μs | 2.729 μs | 0.002 | 0.00 | 1 | 0.7019 | 0.0267 | 11.51 KB | 0.12 |
EggMapper.Benchmarks.ColdStartBenchmark-report-github
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EggMapper | 1.375 ms | 1.581 ms | 0.0866 ms | 1.278 ms | 1.402 ms | 1.445 ms | 1.00 | 0.08 | 1 | 5.8594 | 3.9063 | 96.29 KB | 1.00 |
| AutoMapper | 4.430 ms | 12.278 ms | 0.6730 ms | 3.711 ms | 4.532 ms | 5.046 ms | 3.23 | 0.46 | 2 | 15.6250 | 7.8125 | 309.83 KB | 3.22 |
| Mapster | 4.307 ms | 8.468 ms | 0.4642 ms | 3.777 ms | 4.504 ms | 4.640 ms | 3.14 | 0.34 | 2 | 39.0625 | 15.6250 | 757.27 KB | 7.86 |
📝 Notes
- Each benchmark class is decorated with
[MemoryDiagnoser]and[RankColumn]. - The global config (see
src/EggMapper.Benchmarks/Program.cs) addsMin,Median, andMaxcolumns. - Manual is the hand-written baseline (ratio = 1.00). A ratio < 1 means faster than manual.
- Benchmarks run on GitHub-hosted runners — absolute times may vary between runs; focus on Ratio for comparisons.
- To reproduce locally:
cd src/EggMapper.Benchmarks dotnet run --configuration Release -- --filter '*'
Summary
#FAB400yellow primary,#5956E9purple accent, dark backgroundeggspot.csspages.ymlto deploy static files directly (removes Jekyll build job).nojekyllto disable Jekyll processing on GitHub PagesTest plan
https://eggspot.github.io/EggMapper/<,>)🤖 Generated with Claude Code