1
0
mirror of https://github.com/alexandrev/xslt-lab.git synced 2026-09-20 04:23:16 +00:00
Commit Graph

80 Commits

Author SHA1 Message Date
alexandrev-tibco c86026460c Perf: replace Monaco Editor with CodeMirror 6
Monaco loaded ~2MB from CDN on every visit causing LCP 8.8s.
CodeMirror 6 is bundled locally: 434KB (142KB gzip), no CDN dependency.

- @uiw/react-codemirror + @codemirror/lang-xml + @codemirror/theme-one-dark
- XML syntax highlighting, dark/light theme, readOnly, lineNumbers, wordWrap
- Removes CDN preload hints, loader config, Monaco external/chunk config
- Editor component simplified (no more lazy/Suspense/eager/requestIdleCallback)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 14:12:05 +02:00
alexandrev-tibco 79e7d50ffc UX: replace feedback links with inline n8n webhook form
- Simple form with type selector (idea/bug/other) + textarea
- POSTs to VITE_FEEDBACK_WEBHOOK_URL (runtime env, set in Helm/entrypoint)
- States: idle → sending → success/error
- Removes email/GitHub links — no context switch for user
- Adds VITE_FEEDBACK_WEBHOOK_URL to entrypoint.sh env

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 16:39:02 +02:00
alexandrev-tibco 9394853338 Perf: eager-load main XSLT editor and preload Monaco CDN assets
- Main XSLT editor uses eager=true to skip requestIdleCallback delay
  (it's the LCP element — must render ASAP)
- Secondary editors (XML inputs, result) keep deferred loading
- Preload Monaco CDN loader.js and editor.main.js in <head> so
  they start downloading before JS requests them

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 12:47:08 +02:00
alexandrev-tibco c50f23b23d UX: replace version pill with git commit SHA link to GitHub
The v0.2.0 label was meaningless. Now shows the short commit SHA
that links directly to the commit on GitHub. Injected at build time
via Vite (execSync git rev-parse --short HEAD).

Also removes CHANGELOG.md (unmaintained) and the changelogAnchor helper.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 12:31:19 +02:00
alexandrev-tibco 1f950a0a22 Perf: defer Monaco mount until browser idle to reduce TBT
All editors were mounting simultaneously on initial render, causing
Monaco to block the main thread (TBT 1520ms). Now uses requestIdleCallback
(timeout 1.5s) to defer Monaco initialization until after first paint.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 12:24:15 +02:00
alexandrev-tibco 1d8faf6b3e Perf: add nginx gzip compression and cache headers
- gzip level 6 for JS, CSS, JSON, SVG, fonts
- immutable cache (1yr) for hashed JS/CSS assets
- 7-day cache for static assets (SVG, fonts, images)
- no-store for env.js (runtime config must be fresh)
- no-cache for HTML (SPA index)

Reduces JS transfer from ~460KB to ~115KB gzip.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 12:23:46 +02:00
alexandrev-tibco 15127af247 Fix: use display:none on drop-hint file input to ensure label click works
The file-input CSS class (position:absolute 1px clip) was preventing the
label click from triggering the file picker in some browsers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 11:01:51 +02:00
alexandrev-tibco 2b87e1ffac UX: clicking drop-hint area opens file dialog for XML upload
Users were rage-clicking the "Drop your input XML files here" area
expecting a file picker. Converted to a label with hidden file input
supporting multiple XML files, same logic as drag-and-drop.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 09:29:45 +02:00
alexandrev-tibco a6515606c0 Ads: only refresh when ad is visible (IntersectionObserver)
Refreshing every 30s regardless of visibility was causing low view rate
(23-38%) because the ad was often scrolled out of view. Now uses
IntersectionObserver (threshold 0.5) to gate both the interval refresh
and the post-transform refresh.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 09:26:53 +02:00
alexandrev-tibco 9777436aea Perf: move EthicalAds div to end of DOM to fix LCP
Ad div was first in DOM causing it to be the LCP element (10.2s).
Moved to end of app-container and repositioned visually with order:-1
so the ad still appears at the top without blocking LCP measurement.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 15:41:51 +02:00
alexandrev-tibco 4247dfc2de UX: clicking anywhere on Feedback header toggles the panel
Previously only the arrow button toggled the panel. Now the full header
acts as the toggle, with a guard to ignore clicks that were actually drags.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:48:23 +02:00
alexandrev-tibco 12321a50c0 Ads: add placement ID and refresh on interval + transform
- Add id="xsltplayground-main" to EthicalAds div for Placements report
- Refresh ad every 30s via setInterval
- Also refresh on each successful transform (throttled to 30s minimum)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:29:45 +02:00
alexandrev-tibco 02dc29db82 Perf: load Monaco from CDN, preload logo, suppress ResizeObserver noise 2026-04-16 11:04:33 +02:00
alexandrev-tibco 56cac47eea SEO: add validator to title, improve meta description CTR 2026-04-15 10:27:24 +02:00
alexandrev-tibco 7167205af5 Add VITE_CLARITY_ID support to entrypoint.sh and Helm chart 2026-04-14 10:09:41 +02:00
alexandrev-tibco 563d0789d0 Add user feedback improvements: server error reporting, Clarity analytics, usage survey
- Auto-report link on 5xx/network errors: pre-fills GitHub issue with version, error, and stylesheet snippet
- Microsoft Clarity: conditional on VITE_CLARITY_ID env var, loaded after page load
- Usage survey: appears after 3 successful transforms, fires GA4 event, one-shot (stored in localStorage)
- 27 tests passing (10 new tests covering buildBugReportUrl, server error detection, survey lifecycle)
2026-04-14 10:00:56 +02:00
alexandrev-tibco 39511642e4 SEO: robots.txt with sitemap, related posts links, canonical tags, better CTR snippet 2026-04-13 19:05:52 +02:00
alexandrev-tibco 9786d8d33a Add blog article links to footer for SEO and navigation 2026-04-13 10:17:23 +02:00
alexandrev-tibco beca22e907 Add XSLT 3.0 support and expand test coverage
Frontend:
- Add XSLT 3.0 option to version selector
- Add tests: version selector renders 1.0/2.0/3.0, version change updates stylesheet

Backend:
- Validate version field: reject anything other than 1.0, 2.0, 3.0 or empty
- Add tests: pickSourceXML (preferred keys, fallback, no XML, HTML entity unescaping)
- Add tests: version validation rejects invalid, accepts all valid values

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 14:58:42 +02:00
alexandrev-tibco a333d175f4 SEO improvements and 4 new blog articles
- Update index.html title, description, keywords to include xslt 3.0, validator, saxon
- Update JSON-LD schema with full feature list and XSLT 3.0
- Change footer link from "News" to "Blog & Tutorials", update URL to blog.xsltplayground.com
- New articles: online editor guide, validator guide, string functions, xsl:for-each-group

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 14:55:30 +02:00
alexandrev-tibco 8e8b7eacec Move Hugo blog source to main, fix workflow, add new articles and llms.txt
- Move site/ Hugo source from gh-pages to main so the workflow can trigger correctly
- Fix publish-hugo.yml: now in main, builds and deploys to gh-pages:docs/ via peaceiris/actions-gh-pages
- Add 3 new SEO articles: XSLT 3.0 features, beginners guide, template matching
- Add llms.txt to blog and frontend so ChatGPT/Gemini can recommend the tool better
- Remove stale /site mkdocs ignore rule, add site/public to gitignore instead

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 14:40:12 +02:00
alexandrev-tibco 362ff2b89b Add SEO improvements and CLAUDE.md
- Add visually hidden H1 for search engines and screen readers
- Add JSON-LD structured data (WebApplication schema)
- Add subtle footer tagline with keywords
- Use semantic H1 in loading shell
- Add CLAUDE.md for Claude Code guidance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 13:10:36 +01:00
alexandrev ca99793d00 +1 2026-01-18 17:23:16 +01:00
alexandrev f0ccaba43b fix report 2026-01-18 17:02:56 +01:00
alexandrev d16c145488 fix page dev 2026-01-18 16:55:27 +01:00
alexandrev 5e5619cc3b fix pagedev report 2026-01-18 16:46:07 +01:00
alexandrev 65dcfc7b10 fix pagedev report 2026-01-18 15:45:42 +01:00
alexandrev 9d50dbf956 remove dark mode toggle from top 2026-01-15 09:24:26 +01:00
alexandrev 5cd2200bf8 +1 2026-01-14 23:07:28 +01:00
alexandrev 254b8245e9 dark mode 2026-01-14 22:46:25 +01:00
alexandrev 37e22ac26e new updates 2026-01-12 17:26:49 +01:00
alexandrev 36e2c286f4 change ethicalads 2026-01-10 08:14:57 +01:00
alexandrev 46e50e2f3d EthicalAdsIntegration 2026-01-09 23:49:02 +01:00
alexandrev 7049593b6e fix .gitignore to be able to compile 2025-11-15 22:40:37 +01:00
alexandrev de28a305df version 0.2.0 2025-11-15 22:26:25 +01:00
alexandrev 39d6767ac5 +1 2025-09-23 16:09:29 +02:00
alexandrev ab9da41bc5 +1 2025-07-06 09:06:05 +02:00
alexandrev 4f28dabc0b GA support 2025-07-06 08:56:20 +02:00
alexandrev 384a1e9ccc BuyMeACoffee 2025-07-06 08:36:20 +02:00
alexandrev-tibco 5b1839f486 Merge branch 'refs/heads/codex/add-buymeacoffee-button-to-app' 2025-07-05 14:19:37 +02:00
alexandrev cbba2d8302 Move Buy Me a Coffee script to index.html 2025-07-05 14:18:08 +02:00
alexandrev 4c3b0b56a7 Merge pull request #27 from alexandrev/codex/add-buymeacoffee-button-to-app
Add Buy Me a Coffee button
2025-07-05 13:50:26 +02:00
alexandrev a910012040 Add Buy Me a Coffee button in header 2025-07-05 13:50:09 +02:00
alexandrev 694eaaf920 Merge pull request #20 from alexandrev/codex/integrate-google-analytics
Add Google Analytics integration
2025-07-05 13:48:18 +02:00
alexandrev a8f5212ea7 Add sitemap.xml for frontend 2025-07-05 13:47:45 +02:00
alexandrev 79135cf367 frontend: remove param defs outside block 2025-07-05 09:38:58 +02:00
alexandrev 8a4e114922 Merge pull request #23 from alexandrev/codex/add-xml-pretty-print-button
Add pretty print button
2025-07-05 08:54:57 +02:00
alexandrev 60d851e140 Add XML pretty print formatting 2025-07-05 08:53:14 +02:00
alexandrev 570c970bec +1 2025-07-05 08:52:36 +02:00
alexandrev 3630d682fa feat: add result editor formatting 2025-07-04 19:12:51 +02:00