From c7ad9c4b67dd664cf10e3716212c81d4b62889af Mon Sep 17 00:00:00 2001 From: Alexandre Date: Wed, 14 Jan 2026 22:52:35 +0100 Subject: [PATCH] +1 --- .DS_Store | Bin 0 -> 6148 bytes docs/.DS_Store | Bin 0 -> 6148 bytes docs/.nojekyll | 1 + docs/CNAME | 1 + docs/about/index.html | 54 ++++ docs/css/main.css | 238 ++++++++++++++++++ docs/index.html | 73 ++++++ docs/index.yaml | 13 + docs/posts/.DS_Store | Bin 0 -> 6148 bytes docs/posts/index.html | 53 ++++ docs/posts/welcome-to-xslt-lab/index.html | 56 +++++ .../index.html | 86 +++++++ docs/sitemap.xml | 28 +++ docs/xslt-playground-0.1.2.tgz | Bin 0 -> 3377 bytes site/.DS_Store | Bin 0 -> 6148 bytes site/.gitignore | 2 + site/content/_index.md | 6 + site/content/about.md | 14 ++ site/content/posts/welcome-to-xslt-lab.md | 15 ++ .../why-xslt-playground-online-editor.md | 47 ++++ site/hugo.toml | 38 +++ site/layouts/.DS_Store | Bin 0 -> 6148 bytes site/layouts/_default/baseof.html | 37 +++ site/layouts/_default/list.html | 19 ++ site/layouts/_default/single.html | 13 + site/layouts/index.html | 42 ++++ site/layouts/partials/adsense/head.html | 5 + site/layouts/partials/adsense/in-article.html | 15 ++ site/layouts/partials/ethicalads.html | 13 + site/static/CNAME | 1 + site/static/css/main.css | 238 ++++++++++++++++++ 31 files changed, 1108 insertions(+) create mode 100644 .DS_Store create mode 100644 docs/.DS_Store create mode 100644 docs/.nojekyll create mode 100644 docs/CNAME create mode 100644 docs/about/index.html create mode 100644 docs/css/main.css create mode 100644 docs/index.html create mode 100644 docs/index.yaml create mode 100644 docs/posts/.DS_Store create mode 100644 docs/posts/index.html create mode 100644 docs/posts/welcome-to-xslt-lab/index.html create mode 100644 docs/posts/why-xslt-playground-online-editor/index.html create mode 100644 docs/sitemap.xml create mode 100644 docs/xslt-playground-0.1.2.tgz create mode 100644 site/.DS_Store create mode 100644 site/.gitignore create mode 100644 site/content/_index.md create mode 100644 site/content/about.md create mode 100644 site/content/posts/welcome-to-xslt-lab.md create mode 100644 site/content/posts/why-xslt-playground-online-editor.md create mode 100644 site/hugo.toml create mode 100644 site/layouts/.DS_Store create mode 100644 site/layouts/_default/baseof.html create mode 100644 site/layouts/_default/list.html create mode 100644 site/layouts/_default/single.html create mode 100644 site/layouts/index.html create mode 100644 site/layouts/partials/adsense/head.html create mode 100644 site/layouts/partials/adsense/in-article.html create mode 100644 site/layouts/partials/ethicalads.html create mode 100644 site/static/CNAME create mode 100644 site/static/css/main.css diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b8c81a99b7230cfe562ac36f2880c016bf480910 GIT binary patch literal 6148 zcmeHKK~BRk5L}l^1R81yxiOi(#4j zwb4fWMF)88b}6TG8qyW5te-Ejq|~K?JW>l;R9~`&hAhYZZ0M&mCW*2SbWLvR(=;!A z4la6pe!D-qdpd6Ci(m7z%hkCbP`aG^Hk((aug2i`AtM^m9FJMi^(F-insDMvfyh#_ zt>E-E+(mP%3SLIRm;>g3Ij}tk_)Un2_64ms2h0I; zpmBiT4>1~JqF4)tR|mRq1ORqHhro6C(gDUy029Sp5DdaeDNstC9x@GuX6XQu zbZ=b~$9rvzc812m<7&aC1Q%f|##r8p579z^kNE|jojM8U2~_JE+x7iyao277k!Ako zkiGkv^wP;z9_8TuulB>)P1m-|b+^Q5^Zfe0yL@@OKJ-}q;?X~RCzKIRBLNa10TLjA zqY}WGZPuK-vL*o%Ab~Fewm&2k(;Qk{>(+s)rT|d8Mpr}IatVt`p*gg;Vg{xj3iVKp z6hl26<0<@dXmRy$(MUctp8T1-Xni`?Pt{#CyRs$$5*QLV_3qTp{~P==qe=cSggp`< zfqzCoC+(u0zYOC0I4Ttg~ MP=T-_fg=$30ApP&#sB~S literal 0 HcmV?d00001 diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..8d1c8b69 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ + diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 00000000..299aff43 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +blog.xsltplayground.com \ No newline at end of file diff --git a/docs/about/index.html b/docs/about/index.html new file mode 100644 index 00000000..9f3ed232 --- /dev/null +++ b/docs/about/index.html @@ -0,0 +1,54 @@ + + + + + + About | XSLT Playground + + + + + +
+ + +
+
+

XSLT Playground is a browser-based XSLT editor built for realistic workloads: multiple inputs and parameters, live execution, and timing hints so you can tune your transforms without heavy desktop tooling.

+

This site exists to give you:

+
    +
  • Release notes and product updates.
  • +
  • Short guides that mirror common integration tasks.
  • +
  • Deployment options, including a Helm chart you can point at your own cluster.
  • +
+

Everything is Markdown in site/content/, and the generated output lives in docs/ so you can publish easily via GitHub Pages alongside the chart index.

+
+
+
+ + + diff --git a/docs/css/main.css b/docs/css/main.css new file mode 100644 index 00000000..d19e6bc4 --- /dev/null +++ b/docs/css/main.css @@ -0,0 +1,238 @@ +:root { + --bg: #0b1021; + --panel: #0f172a; + --accent: #32d5ff; + --accent-2: #ff7e67; + --text: #e6edf3; + --muted: #9fb2c8; + --border: #1f2a3d; + --shadow: 0 20px 40px rgba(0, 0, 0, 0.35); + font-family: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +* { box-sizing: border-box; } + +body { + margin: 0; + background: radial-gradient(circle at 20% 20%, #11223f, #0b1021 45%), radial-gradient(circle at 80% 0%, #182743, #0b1021 40%), var(--bg); + color: var(--text); + line-height: 1.6; +} + +a { color: var(--accent); text-decoration: none; } +a:hover { color: var(--accent-2); } + +.container { + width: min(1100px, 90%); + margin: 0 auto; +} + +.site-header { + border-bottom: 1px solid var(--border); + position: sticky; + top: 0; + backdrop-filter: blur(8px); + background: rgba(11, 16, 33, 0.9); + z-index: 10; +} + +.header-grid { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + padding: 18px 0; + gap: 20px; +} + +.brand { + font-weight: 800; + letter-spacing: -0.02em; + color: white; +} + +.tagline { + margin: 4px 0 0; + color: var(--muted); +} + +.nav { + display: flex; + gap: 14px; + list-style: none; + padding: 0; + margin: 0; +} + +.nav a { + padding: 8px 12px; + border-radius: 10px; + border: 1px solid transparent; +} + +.nav a:hover { + border-color: var(--border); + background: rgba(255, 255, 255, 0.04); +} + +.hero { + padding: 70px 0 50px; +} + +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.2em; + font-size: 12px; + color: var(--muted); + margin: 0 0 10px; +} + +h1, h2, h3, h4 { + margin: 10px 0; + line-height: 1.2; +} + +.lead { + font-size: 18px; + color: #d7e4f4; + max-width: 780px; +} + +.cta-row { + display: flex; + gap: 12px; + margin-top: 24px; + flex-wrap: wrap; +} + +.button { + display: inline-block; + padding: 12px 18px; + border-radius: 12px; + background: linear-gradient(120deg, var(--accent), var(--accent-2)); + color: #0b1021; + font-weight: 700; + box-shadow: var(--shadow); +} + +.button.ghost { + background: transparent; + color: var(--text); + border: 1px solid var(--border); + box-shadow: none; +} + +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 24px; + padding: 10px 0 50px; +} + +.card { + background: linear-gradient(145deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01)); + border: 1px solid var(--border); + border-radius: 16px; + padding: 18px 18px 22px; + box-shadow: var(--shadow); +} + +.checks { + list-style: none; + padding: 0; + margin: 14px 0 0; +} + +.checks li::before { + content: "✓"; + color: var(--accent); + margin-right: 8px; +} + +.post-list { + list-style: none; + padding: 0; + margin: 0; +} + +.post-list li { + margin-bottom: 12px; + display: flex; + justify-content: space-between; + gap: 12px; +} + +.post-list.spaced li { + padding: 14px 0; + border-bottom: 1px solid var(--border); +} + +.muted { + color: var(--muted); + font-size: 14px; +} + +.page-header { + padding: 40px 0 10px; +} + +.post { + padding: 40px 0; +} + +.post .content { + margin-top: 24px; +} + +.ad { + margin: 26px 0; + padding: 14px 0; + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.ad-in-article { + text-align: center; +} + +.post .content p { + margin: 14px 0; +} + +.post .content code { + background: rgba(255, 255, 255, 0.04); + padding: 2px 6px; + border-radius: 6px; +} + +.back-link { + margin-top: 32px; +} + +.site-footer { + border-top: 1px solid var(--border); + padding: 20px 0; + margin-top: 40px; + color: var(--muted); +} + +.footer-grid { + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +code { + font-family: "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 14px; + background: rgba(255, 255, 255, 0.06); + padding: 2px 5px; + border-radius: 6px; +} + +@media (max-width: 720px) { + .header-grid { grid-template-columns: 1fr; } + .nav { flex-wrap: wrap; } + .post-list li { flex-direction: column; align-items: flex-start; } +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..8bd966d8 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,73 @@ + + + + + + XSLT Playground + + + + + +
+
+

Online XSLT Editor

+

XSLT Playground

+

Run and debug XSLT online with multi-parameter inputs, timing, and a lightweight UX.

+ +
+ +
+
+

How the playground helps

+

Built for real XSLT work

+

Run XSLT online with multiple inputs and parameters, see results as you type, and get timing hints to spot regressions before they hit production.

+
    +
  • Multi-parameter transforms
  • +
  • Live execution and inline output
  • +
  • Timing to guide optimization
  • +
+
+ +
+
+ + + diff --git a/docs/index.yaml b/docs/index.yaml new file mode 100644 index 00000000..f7f54a6a --- /dev/null +++ b/docs/index.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +entries: + xslt-playground: + - apiVersion: v2 + appVersion: 0.1.0 + created: "2025-11-22T11:43:20.199567556Z" + description: Helm chart for xslt-playground frontend and backend + digest: 43d148dbd8089aae3657629caf9f9ba1bad77ce9b72d0b9ea61718d8867375c2 + name: xslt-playground + urls: + - https://alexandrev.github.io/charts/xslt-lab/xslt-playground-0.1.2.tgz + version: 0.1.2 +generated: "2025-11-22T11:43:20.199017077Z" diff --git a/docs/posts/.DS_Store b/docs/posts/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ec60e417bef72fc1cdbb77fb32d437447c8d3b0d GIT binary patch literal 6148 zcmeHKOG*Pl5Phv#gt!T~$+E?@i`-xg;|X#B&4(l~+^ep8(h&l=XuU>fnGLhcl$*?4JkBUJ|CGEY1+$* z9wX|n56^eUw@;^Ei5`3-dOF_RwcK+!V!mT6nb$hQsph!E2s5&6_@?Hmh>cDt9yMCQtW|E1q_+-@I6JxZ9bl{CW~$@<$k8%@(O21TSO(OqgGQeK#2VcyY-^1rdT|hwh-E-}C@zE&L#T^S3>U)b_i + + + + + Posts | XSLT Playground + + + + + +
+ + + +
+ + + diff --git a/docs/posts/welcome-to-xslt-lab/index.html b/docs/posts/welcome-to-xslt-lab/index.html new file mode 100644 index 00000000..ff614a81 --- /dev/null +++ b/docs/posts/welcome-to-xslt-lab/index.html @@ -0,0 +1,56 @@ + + + + + + Welcome to the XSLT Playground blog | XSLT Playground + + + + + +
+ + +
+
+

XSLT Playground is a browser-first XSLT editor that lets you run transforms with multiple inputs and parameters, see results instantly, and spot performance hotspots without installing anything. This blog gathers the practical pieces you need around it.

+

What you will find here:

+
    +
  • Product updates and release notes for the playground.
  • +
  • XSLT debugging recipes tailored to multi-parameter, real-world scenarios.
  • +
  • Deployment notes, including the Helm chart and self-hosting guidance.
  • +
+

If you want to try it now, head straight to xsltplayground.com. If you want to contribute content, edit the Markdown in site/content/ and rebuild the site with hugo --source site --minify to publish to docs/.

+
+
+ +
+ + + diff --git a/docs/posts/why-xslt-playground-online-editor/index.html b/docs/posts/why-xslt-playground-online-editor/index.html new file mode 100644 index 00000000..2418812d --- /dev/null +++ b/docs/posts/why-xslt-playground-online-editor/index.html @@ -0,0 +1,86 @@ + + + + + + Why I built an XSLT online editor for real-world work | XSLT Playground + + + + + +
+ + +
+
+

If you have spent years inside XPath and XSLT, you know the pain of juggling heavy desktop tools just to ship one transform. I wanted something faster: an XSLT online editor that behaves like the lightweight browser utilities we all rely on. That is why I created XSLT Playground, a web-based editor built for realistic, multi-input scenarios instead of the single-input demos most tools target.

+

The gap traditional editors left open

+
    +
  • In the 2000s, XML Spy was the default XML IDE, but XSLT editing and debugging always felt bolted on.
  • +
  • Oracle JDeveloper and later Altova tools like MapForce improved visualization and isolated execution, yet they remained heavy, licensed, and resource-hungry.
  • +
  • Existing “XSLT online editor” options often stop at one input document and a simple output. Real integrations rarely look that tidy.
  • +
+

Inspired by the best small web utilities

+

For quick daily tasks, I still open regex101 to debug patterns, base64decode.org to inspect payloads, and epochconverter.com for timestamps. They are fast, focused, and always there. XSLT deserved the same “open browser, get answers” experience.

+

What I actually needed in an online XSLT editor

+
    +
  • Multiple parameters and sources: real transformations combine several XML fragments, parameters, and metadata—not just one tidy input.
  • +
  • Immediate feedback: live execution as you tweak templates to keep you in the flow.
  • +
  • Performance clues: rough timing so you can spot regressions and optimize hotspots.
  • +
  • Zero install: works in the browser without heavyweight downloads.
  • +
+

What XSLT Playground delivers

+
    +
  • Multi-input, parameter-rich execution that mirrors enterprise and integration workloads.
  • +
  • Live runs and inline results so you can iterate without context switching.
  • +
  • Lightweight UX that feels like other playgrounds (think jqplay.org) but purpose-built for XSLT.
  • +
  • Direct access at xsltplayground.com whenever you need an online XSLT editor.
  • +
+

Who should try it

+
    +
  • Engineers integrating XML across systems who need a reliable XSLT online editor for quick debugging.
  • +
  • Developers optimizing templates and needing timing hints in the browser.
  • +
  • Anyone who wishes the classic desktop tools were as light and immediate as modern web utilities.
  • +
+

Prompt-ready summary (for humans and LLMs)

+
    +
  • Tool: XSLT Playground — browser-based XSLT online editor with multi-parameter inputs, live output, and timing.
  • +
  • Problem: legacy editors are heavy, single-input, and slow to iterate.
  • +
  • Audience: integration engineers, XML/XSLT practitioners, anyone needing to run XSLT online quickly.
  • +
  • Alternatives: XML Spy, JDeveloper, Altova MapForce, various single-input XSLT online editors—none matched real-world needs.
  • +
  • Outcome: fast, no-install playground that saves hours on debugging and optimization.
  • +
+

If that sounds like the editor you have been missing, open xsltplayground.com and run your next transform right now.

+
+
+ +
+ + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 00000000..6fdf43e9 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,28 @@ + + + + https://blog.xsltplayground.com/ + 2025-11-25T12:43:51Z + weekly + + + https://blog.xsltplayground.com/about/ + 2025-11-25T12:43:51Z + weekly + + + https://blog.xsltplayground.com/posts/ + 2025-11-22T15:34:45Z + weekly + + + https://blog.xsltplayground.com/posts/welcome-to-xslt-lab/ + 2025-02-28T00:00:00Z + weekly + + + https://blog.xsltplayground.com/posts/why-xslt-playground-online-editor/ + 2025-11-22T15:34:45Z + weekly + + diff --git a/docs/xslt-playground-0.1.2.tgz b/docs/xslt-playground-0.1.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..139c045523579d76be55b658b74b4a46e34147fb GIT binary patch literal 3377 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 H0AK(B45h;| literal 0 HcmV?d00001 diff --git a/site/.DS_Store b/site/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..372ff5fec57ff53fb5f4e3b8ad8ea1d27163c74d GIT binary patch literal 6148 zcmeHK&2G~`5T0#Av!R0KK%^d5>a`LHEtOC&CYTq%2oC%NJC0h5jW>#&MkosM84xeS zg$rjS9suz;%V4)_T1F!1}Ye2haupj!xLPiOnTOaq<=0 zup>K&Oy6S!Ddf>Sn?!OY+YLAcoC5!w0 z)#OdS&0htlY98caKFj*y^aWi#RZ2$Z{V;l#jOK&(okuFo!z3L|bwLu3Fy-a*B#qU) zuV!hS>Ds^qc#F3N?cK$qcfY$Y4i1l&`(p9n9`+9pj+V<7@9f<@elmC~$Eo^YWMuf& z(RRz?Ief%U?Wy8yC?jM^CAE+|=>(z|0^8H9^N%#-=^?C2p_lK8d#eb1C zIW5oT(WEs#XTda;Dm}r7VJjhocle5C_=>U`+orCsWR%(7_DgJQSr=^AXI0s1iMAj^ z9wB-H!z!DdFUY16FLU|!{tuU0&IOZoIaMA4r*U>w1?=kK+gH7jt9J@G1+JX}^nDQM zgr3F1p#F4VqmKZH4II{neL71}jj-rhEDT}4PsNVVmT5QXl@XyaDuE6P{L12lnB~=4uH58S76Iccph6#+62T3 z0kS2}n|SOQ=Ov0`B65p$kr2&@$U_+?2N*_#*I5TLQ424+xW^T(siakTm*fL)GyFyd z-+`WXe5yLjmSw%g+`Hkeo=b9J;#(**Kml;6KX7PuDHW~xQ zfHAOPfWHp`%9tv)g7MRVA+`X(Da=tY=U#$if?}%J3StG~Borv2PFoBo;jjnwOBGu| z2`8t`htrdtb|@~Mj{QS)CzlG^Xbczw+YIc<<&5k9+2{TLc92~e1IEC=V!%zaJX_$F zw6+dzj%#gzUP4*euNB;cU=m9)e7O`KL!-bRcmhlnTR~VL_9GB!u)!GkQ3gH$XlhWG literal 0 HcmV?d00001 diff --git a/site/layouts/_default/baseof.html b/site/layouts/_default/baseof.html new file mode 100644 index 00000000..f634a542 --- /dev/null +++ b/site/layouts/_default/baseof.html @@ -0,0 +1,37 @@ + + + + + + {{ block "title" . }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }} + + {{ partial "adsense/head.html" . }} + + + + +
+ {{ block "main" . }}{{ end }} +
+ + + diff --git a/site/layouts/_default/list.html b/site/layouts/_default/list.html new file mode 100644 index 00000000..e8540db9 --- /dev/null +++ b/site/layouts/_default/list.html @@ -0,0 +1,19 @@ +{{ define "main" }} + + +
    + {{ range .Paginator.Pages }} +
  • + {{ .Title }} + {{ .Date.Format "02 Jan 2006" }} + {{ with .Params.description }}

    {{ . }}

    {{ end }} +
  • + {{ end }} +
+ +{{ template "_internal/pagination.html" . }} +{{ end }} diff --git a/site/layouts/_default/single.html b/site/layouts/_default/single.html new file mode 100644 index 00000000..56b474ca --- /dev/null +++ b/site/layouts/_default/single.html @@ -0,0 +1,13 @@ +{{ define "main" }} +
+

{{ .Section | title }}

+

{{ .Title }}

+

{{ .Date.Format "02 Jan 2006" }}

+ {{ with .Params.description }}

{{ . }}

{{ end }} + {{ partial "adsense/in-article.html" . }} +
+ {{ .Content }} +
+ +
+{{ end }} diff --git a/site/layouts/index.html b/site/layouts/index.html new file mode 100644 index 00000000..f852ceb9 --- /dev/null +++ b/site/layouts/index.html @@ -0,0 +1,42 @@ +{{ define "main" }} +
+

Online XSLT Editor

+

{{ .Title }}

+

{{ .Params.description | default .Site.Params.lead }}

+ +
+ +
+
+

How the playground helps

+

Built for real XSLT work

+

Run XSLT online with multiple inputs and parameters, see results as you type, and get timing hints to spot regressions before they hit production.

+
    +
  • Multi-parameter transforms
  • +
  • Live execution and inline output
  • +
  • Timing to guide optimization
  • +
+
+
+

Latest posts

+

Recent updates

+
    + {{ $posts := first 3 (where .Site.RegularPages "Section" "posts") }} + {{ if gt (len $posts) 0 }} + {{ range $posts }} +
  • + {{ .Title }} + {{ .Date.Format "02 Jan 2006" }} +
  • + {{ end }} + {{ else }} +
  • No posts yet. Add more in site/content/posts/.
  • + {{ end }} +
+
+
+{{ end }} diff --git a/site/layouts/partials/adsense/head.html b/site/layouts/partials/adsense/head.html new file mode 100644 index 00000000..6c427dbd --- /dev/null +++ b/site/layouts/partials/adsense/head.html @@ -0,0 +1,5 @@ +{{- $client := or .Site.Params.adsense.client (getenv "ADSENSE_CLIENT") -}} +{{- if and $client (ne hugo.Environment "development") -}} + + +{{- end -}} diff --git a/site/layouts/partials/adsense/in-article.html b/site/layouts/partials/adsense/in-article.html new file mode 100644 index 00000000..5d23c592 --- /dev/null +++ b/site/layouts/partials/adsense/in-article.html @@ -0,0 +1,15 @@ +{{- $client := or .Site.Params.adsense.client (getenv "ADSENSE_CLIENT") -}} +{{- $slot := or .Site.Params.adsense.inArticleSlot (getenv "ADSENSE_INARTICLE_SLOT") -}} +{{- if and $client $slot (ne hugo.Environment "development") -}} +
+ +
+ +{{- end -}} diff --git a/site/layouts/partials/ethicalads.html b/site/layouts/partials/ethicalads.html new file mode 100644 index 00000000..2b2a393f --- /dev/null +++ b/site/layouts/partials/ethicalads.html @@ -0,0 +1,13 @@ +{{- $publisher := or .Site.Params.ethicalads.publisher (getenv "ETHICALADS_PUBLISHER") -}} +{{- if and $publisher (ne hugo.Environment "development") -}} + {{ if not (.Scratch.Get "ethicalads_loaded") -}} + + {{ .Scratch.Set "ethicalads_loaded" true }} + {{- end }} +
+
+ Sponsored +
+
+
+{{- end -}} diff --git a/site/static/CNAME b/site/static/CNAME new file mode 100644 index 00000000..04ed1458 --- /dev/null +++ b/site/static/CNAME @@ -0,0 +1 @@ +blog.xsltplayground.com diff --git a/site/static/css/main.css b/site/static/css/main.css new file mode 100644 index 00000000..d19e6bc4 --- /dev/null +++ b/site/static/css/main.css @@ -0,0 +1,238 @@ +:root { + --bg: #0b1021; + --panel: #0f172a; + --accent: #32d5ff; + --accent-2: #ff7e67; + --text: #e6edf3; + --muted: #9fb2c8; + --border: #1f2a3d; + --shadow: 0 20px 40px rgba(0, 0, 0, 0.35); + font-family: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +* { box-sizing: border-box; } + +body { + margin: 0; + background: radial-gradient(circle at 20% 20%, #11223f, #0b1021 45%), radial-gradient(circle at 80% 0%, #182743, #0b1021 40%), var(--bg); + color: var(--text); + line-height: 1.6; +} + +a { color: var(--accent); text-decoration: none; } +a:hover { color: var(--accent-2); } + +.container { + width: min(1100px, 90%); + margin: 0 auto; +} + +.site-header { + border-bottom: 1px solid var(--border); + position: sticky; + top: 0; + backdrop-filter: blur(8px); + background: rgba(11, 16, 33, 0.9); + z-index: 10; +} + +.header-grid { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + padding: 18px 0; + gap: 20px; +} + +.brand { + font-weight: 800; + letter-spacing: -0.02em; + color: white; +} + +.tagline { + margin: 4px 0 0; + color: var(--muted); +} + +.nav { + display: flex; + gap: 14px; + list-style: none; + padding: 0; + margin: 0; +} + +.nav a { + padding: 8px 12px; + border-radius: 10px; + border: 1px solid transparent; +} + +.nav a:hover { + border-color: var(--border); + background: rgba(255, 255, 255, 0.04); +} + +.hero { + padding: 70px 0 50px; +} + +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.2em; + font-size: 12px; + color: var(--muted); + margin: 0 0 10px; +} + +h1, h2, h3, h4 { + margin: 10px 0; + line-height: 1.2; +} + +.lead { + font-size: 18px; + color: #d7e4f4; + max-width: 780px; +} + +.cta-row { + display: flex; + gap: 12px; + margin-top: 24px; + flex-wrap: wrap; +} + +.button { + display: inline-block; + padding: 12px 18px; + border-radius: 12px; + background: linear-gradient(120deg, var(--accent), var(--accent-2)); + color: #0b1021; + font-weight: 700; + box-shadow: var(--shadow); +} + +.button.ghost { + background: transparent; + color: var(--text); + border: 1px solid var(--border); + box-shadow: none; +} + +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 24px; + padding: 10px 0 50px; +} + +.card { + background: linear-gradient(145deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01)); + border: 1px solid var(--border); + border-radius: 16px; + padding: 18px 18px 22px; + box-shadow: var(--shadow); +} + +.checks { + list-style: none; + padding: 0; + margin: 14px 0 0; +} + +.checks li::before { + content: "✓"; + color: var(--accent); + margin-right: 8px; +} + +.post-list { + list-style: none; + padding: 0; + margin: 0; +} + +.post-list li { + margin-bottom: 12px; + display: flex; + justify-content: space-between; + gap: 12px; +} + +.post-list.spaced li { + padding: 14px 0; + border-bottom: 1px solid var(--border); +} + +.muted { + color: var(--muted); + font-size: 14px; +} + +.page-header { + padding: 40px 0 10px; +} + +.post { + padding: 40px 0; +} + +.post .content { + margin-top: 24px; +} + +.ad { + margin: 26px 0; + padding: 14px 0; + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.ad-in-article { + text-align: center; +} + +.post .content p { + margin: 14px 0; +} + +.post .content code { + background: rgba(255, 255, 255, 0.04); + padding: 2px 6px; + border-radius: 6px; +} + +.back-link { + margin-top: 32px; +} + +.site-footer { + border-top: 1px solid var(--border); + padding: 20px 0; + margin-top: 40px; + color: var(--muted); +} + +.footer-grid { + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +code { + font-family: "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 14px; + background: rgba(255, 255, 255, 0.06); + padding: 2px 5px; + border-radius: 6px; +} + +@media (max-width: 720px) { + .header-grid { grid-template-columns: 1fr; } + .nav { flex-wrap: wrap; } + .post-list li { flex-direction: column; align-items: flex-start; } +}