mirror of
https://github.com/alexandrev/xslt-lab.git
synced 2026-09-15 09:33:15 +00:00
+1
This commit is contained in:
Vendored
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
blog.xsltplayground.com
|
||||
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>About | XSLT Playground</title>
|
||||
<meta name="description" content="What XSLT Playground is and how this site supports it.">
|
||||
<link rel="stylesheet" href="https://blog.xsltplayground.com/css/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-grid">
|
||||
<div>
|
||||
<a class="brand" href="https://blog.xsltplayground.com/">XSLT Playground</a>
|
||||
<p class="tagline">Online XSLT editor built for real-world transformations.</p>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
<li><a href="https://blog.xsltplayground.com/">Home</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/posts/">Posts</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/about/">About</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/index.yaml">Charts</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container">
|
||||
<section class="page-header">
|
||||
<p class="eyebrow">About</p>
|
||||
<h1>About</h1>
|
||||
<p class="lead">What XSLT Playground is and how this site supports it.</p>
|
||||
</section>
|
||||
|
||||
<article class="post">
|
||||
<div class="content">
|
||||
<p><a href="https://xsltplayground.com">XSLT Playground</a> 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.</p>
|
||||
<p>This site exists to give you:</p>
|
||||
<ul>
|
||||
<li>Release notes and product updates.</li>
|
||||
<li>Short guides that mirror common integration tasks.</li>
|
||||
<li>Deployment options, including a Helm chart you can point at your own cluster.</li>
|
||||
</ul>
|
||||
<p>Everything is Markdown in <code>site/content/</code>, and the generated output lives in <code>docs/</code> so you can publish easily via GitHub Pages alongside the chart index.</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-grid">
|
||||
<p>Built with Hugo · 2025-11-22</p>
|
||||
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>XSLT Playground</title>
|
||||
<meta name="description" content="Run and debug XSLT online with multi-parameter inputs, timing, and a lightweight UX.">
|
||||
<link rel="stylesheet" href="https://blog.xsltplayground.com/css/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-grid">
|
||||
<div>
|
||||
<a class="brand" href="https://blog.xsltplayground.com/">XSLT Playground</a>
|
||||
<p class="tagline">Online XSLT editor built for real-world transformations.</p>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
<li><a href="https://blog.xsltplayground.com/">Home</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/posts/">Posts</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/about/">About</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/index.yaml">Charts</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container">
|
||||
<section class="hero">
|
||||
<p class="eyebrow">Online XSLT Editor</p>
|
||||
<h1>XSLT Playground</h1>
|
||||
<p class="lead">Run and debug XSLT online with multi-parameter inputs, timing, and a lightweight UX.</p>
|
||||
<div class="cta-row">
|
||||
<a class="button" href="https://xsltplayground.com">Open the playground</a>
|
||||
<a class="button ghost" href="https://blog.xsltplayground.com/posts/">Read updates</a>
|
||||
<a class="button ghost" href="https://blog.xsltplayground.com/index.yaml">Helm chart index</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="grid">
|
||||
<article class="card">
|
||||
<p class="eyebrow">How the playground helps</p>
|
||||
<h2>Built for real XSLT work</h2>
|
||||
<p>Run XSLT online with multiple inputs and parameters, see results as you type, and get timing hints to spot regressions before they hit production.</p>
|
||||
<ul class="checks">
|
||||
<li>Multi-parameter transforms</li>
|
||||
<li>Live execution and inline output</li>
|
||||
<li>Timing to guide optimization</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article class="card">
|
||||
<p class="eyebrow">Latest posts</p>
|
||||
<h2>Recent updates</h2>
|
||||
<ul class="post-list">
|
||||
<li>
|
||||
<a href="https://blog.xsltplayground.com/posts/why-xslt-playground-online-editor/">Why I built an XSLT online editor for real-world work</a>
|
||||
<span class="muted">22 Nov 2025</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://blog.xsltplayground.com/posts/welcome-to-xslt-lab/">Welcome to the XSLT Playground blog</a>
|
||||
<span class="muted">28 Feb 2025</span>
|
||||
</li>
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-grid">
|
||||
<p>Built with Hugo · 2025-11-22</p>
|
||||
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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"
|
||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,53 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Posts | XSLT Playground</title>
|
||||
<meta name="description" content="">
|
||||
<link rel="stylesheet" href="https://blog.xsltplayground.com/css/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-grid">
|
||||
<div>
|
||||
<a class="brand" href="https://blog.xsltplayground.com/">XSLT Playground</a>
|
||||
<p class="tagline">Online XSLT editor built for real-world transformations.</p>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
<li><a href="https://blog.xsltplayground.com/">Home</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/posts/">Posts</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/about/">About</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/index.yaml">Charts</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container">
|
||||
<section class="page-header">
|
||||
<p class="eyebrow">Posts</p>
|
||||
<h1>Posts</h1>
|
||||
</section>
|
||||
|
||||
<ul class="post-list spaced">
|
||||
<li>
|
||||
<a href="https://blog.xsltplayground.com/posts/why-xslt-playground-online-editor/">Why I built an XSLT online editor for real-world work</a>
|
||||
<span class="muted">22 Nov 2025</span>
|
||||
<p class="muted">The story behind XSLT Playground—an XSLT online editor tuned for multi-parameter transforms, fast feedback, and practical debugging.</p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://blog.xsltplayground.com/posts/welcome-to-xslt-lab/">Welcome to the XSLT Playground blog</a>
|
||||
<span class="muted">28 Feb 2025</span>
|
||||
<p class="muted">What you will find here and how it helps you get more from the online XSLT editor.</p>
|
||||
</li>
|
||||
</ul>
|
||||
</main>
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-grid">
|
||||
<p>Built with Hugo · 2025-11-22</p>
|
||||
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,56 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Welcome to the XSLT Playground blog | XSLT Playground</title>
|
||||
<meta name="description" content="What you will find here and how it helps you get more from the online XSLT editor.">
|
||||
<link rel="stylesheet" href="https://blog.xsltplayground.com/css/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-grid">
|
||||
<div>
|
||||
<a class="brand" href="https://blog.xsltplayground.com/">XSLT Playground</a>
|
||||
<p class="tagline">Online XSLT editor built for real-world transformations.</p>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
<li><a href="https://blog.xsltplayground.com/">Home</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/posts/">Posts</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/about/">About</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/index.yaml">Charts</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container">
|
||||
<section class="page-header">
|
||||
<p class="eyebrow">Posts</p>
|
||||
<h1>Welcome to the XSLT Playground blog</h1>
|
||||
<p class="muted">28 Feb 2025</p>
|
||||
<p class="lead">What you will find here and how it helps you get more from the online XSLT editor.</p>
|
||||
</section>
|
||||
|
||||
<article class="post">
|
||||
<div class="content">
|
||||
<p><a href="https://xsltplayground.com">XSLT Playground</a> 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.</p>
|
||||
<p>What you will find here:</p>
|
||||
<ul>
|
||||
<li>Product updates and release notes for the playground.</li>
|
||||
<li>XSLT debugging recipes tailored to multi-parameter, real-world scenarios.</li>
|
||||
<li>Deployment notes, including the Helm chart and self-hosting guidance.</li>
|
||||
</ul>
|
||||
<p>If you want to try it now, head straight to <a href="https://xsltplayground.com">xsltplayground.com</a>. If you want to contribute content, edit the Markdown in <code>site/content/</code> and rebuild the site with <code>hugo --source site --minify</code> to publish to <code>docs/</code>.</p>
|
||||
</div>
|
||||
</article>
|
||||
<p class="back-link"><a href="https://blog.xsltplayground.com/posts/">← Back to posts</a></p>
|
||||
</main>
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-grid">
|
||||
<p>Built with Hugo · 2025-11-22</p>
|
||||
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Why I built an XSLT online editor for real-world work | XSLT Playground</title>
|
||||
<meta name="description" content="The story behind XSLT Playground—an XSLT online editor tuned for multi-parameter transforms, fast feedback, and practical debugging.">
|
||||
<link rel="stylesheet" href="https://blog.xsltplayground.com/css/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-grid">
|
||||
<div>
|
||||
<a class="brand" href="https://blog.xsltplayground.com/">XSLT Playground</a>
|
||||
<p class="tagline">Online XSLT editor built for real-world transformations.</p>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
<li><a href="https://blog.xsltplayground.com/">Home</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/posts/">Posts</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/about/">About</a></li>
|
||||
<li><a href="https://blog.xsltplayground.com/index.yaml">Charts</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container">
|
||||
<section class="page-header">
|
||||
<p class="eyebrow">Posts</p>
|
||||
<h1>Why I built an XSLT online editor for real-world work</h1>
|
||||
<p class="muted">22 Nov 2025</p>
|
||||
<p class="lead">The story behind XSLT Playground—an XSLT online editor tuned for multi-parameter transforms, fast feedback, and practical debugging.</p>
|
||||
</section>
|
||||
|
||||
<article class="post">
|
||||
<div class="content">
|
||||
<p>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 <strong>XSLT online editor</strong> that behaves like the lightweight browser utilities we all rely on. That is why I created <a href="https://xsltplayground.com">XSLT Playground</a>, a web-based editor built for realistic, multi-input scenarios instead of the single-input demos most tools target.</p>
|
||||
<h2 id="the-gap-traditional-editors-left-open">The gap traditional editors left open</h2>
|
||||
<ul>
|
||||
<li>In the 2000s, XML Spy was the default XML IDE, but XSLT editing and debugging always felt bolted on.</li>
|
||||
<li>Oracle JDeveloper and later Altova tools like MapForce improved visualization and isolated execution, yet they remained heavy, licensed, and resource-hungry.</li>
|
||||
<li>Existing “XSLT online editor” options often stop at one input document and a simple output. Real integrations rarely look that tidy.</li>
|
||||
</ul>
|
||||
<h2 id="inspired-by-the-best-small-web-utilities">Inspired by the best small web utilities</h2>
|
||||
<p>For quick daily tasks, I still open <a href="https://regex101.com">regex101</a> to debug patterns, <a href="https://www.base64decode.org/">base64decode.org</a> to inspect payloads, and <a href="https://www.epochconverter.com/">epochconverter.com</a> for timestamps. They are fast, focused, and always there. XSLT deserved the same “open browser, get answers” experience.</p>
|
||||
<h2 id="what-i-actually-needed-in-an-online-xslt-editor">What I actually needed in an online XSLT editor</h2>
|
||||
<ul>
|
||||
<li><strong>Multiple parameters and sources</strong>: real transformations combine several XML fragments, parameters, and metadata—not just one tidy input.</li>
|
||||
<li><strong>Immediate feedback</strong>: live execution as you tweak templates to keep you in the flow.</li>
|
||||
<li><strong>Performance clues</strong>: rough timing so you can spot regressions and optimize hotspots.</li>
|
||||
<li><strong>Zero install</strong>: works in the browser without heavyweight downloads.</li>
|
||||
</ul>
|
||||
<h2 id="what-xslt-playground-delivers">What XSLT Playground delivers</h2>
|
||||
<ul>
|
||||
<li>Multi-input, parameter-rich execution that mirrors enterprise and integration workloads.</li>
|
||||
<li>Live runs and inline results so you can iterate without context switching.</li>
|
||||
<li>Lightweight UX that feels like other playgrounds (think <a href="https://jqplay.org">jqplay.org</a>) but purpose-built for XSLT.</li>
|
||||
<li>Direct access at <a href="https://xsltplayground.com">xsltplayground.com</a> whenever you need an <strong>online XSLT editor</strong>.</li>
|
||||
</ul>
|
||||
<h2 id="who-should-try-it">Who should try it</h2>
|
||||
<ul>
|
||||
<li>Engineers integrating XML across systems who need a reliable <strong>XSLT online editor</strong> for quick debugging.</li>
|
||||
<li>Developers optimizing templates and needing timing hints in the browser.</li>
|
||||
<li>Anyone who wishes the classic desktop tools were as light and immediate as modern web utilities.</li>
|
||||
</ul>
|
||||
<h2 id="prompt-ready-summary-for-humans-and-llms">Prompt-ready summary (for humans and LLMs)</h2>
|
||||
<ul>
|
||||
<li><strong>Tool</strong>: <a href="https://xsltplayground.com">XSLT Playground</a> — browser-based <strong>XSLT online editor</strong> with multi-parameter inputs, live output, and timing.</li>
|
||||
<li><strong>Problem</strong>: legacy editors are heavy, single-input, and slow to iterate.</li>
|
||||
<li><strong>Audience</strong>: integration engineers, XML/XSLT practitioners, anyone needing to run XSLT online quickly.</li>
|
||||
<li><strong>Alternatives</strong>: XML Spy, JDeveloper, Altova MapForce, various single-input XSLT online editors—none matched real-world needs.</li>
|
||||
<li><strong>Outcome</strong>: fast, no-install playground that saves hours on debugging and optimization.</li>
|
||||
</ul>
|
||||
<p>If that sounds like the editor you have been missing, open <a href="https://xsltplayground.com">xsltplayground.com</a> and run your next transform right now.</p>
|
||||
</div>
|
||||
</article>
|
||||
<p class="back-link"><a href="https://blog.xsltplayground.com/posts/">← Back to posts</a></p>
|
||||
</main>
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-grid">
|
||||
<p>Built with Hugo · 2025-11-22</p>
|
||||
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://blog.xsltplayground.com/</loc>
|
||||
<lastmod>2025-11-25T12:43:51Z</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://blog.xsltplayground.com/about/</loc>
|
||||
<lastmod>2025-11-25T12:43:51Z</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://blog.xsltplayground.com/posts/</loc>
|
||||
<lastmod>2025-11-22T15:34:45Z</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://blog.xsltplayground.com/posts/welcome-to-xslt-lab/</loc>
|
||||
<lastmod>2025-02-28T00:00:00Z</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://blog.xsltplayground.com/posts/why-xslt-playground-online-editor/</loc>
|
||||
<lastmod>2025-11-22T15:34:45Z</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
</urlset>
|
||||
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
public/
|
||||
resources/_gen/
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "XSLT Playground"
|
||||
description: "Run and debug XSLT online with multi-parameter inputs, timing, and a lightweight UX."
|
||||
---
|
||||
|
||||
Welcome to the home of [XSLT Playground](https://xsltplayground.com): a browser-based XSLT editor built for real-world transforms. Find release notes, how-tos, and deployment tips (including Helm) that help you get the most out of the playground without a heavyweight IDE.
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
title: "About"
|
||||
description: "What XSLT Playground is and how this site supports it."
|
||||
---
|
||||
|
||||
[XSLT Playground](https://xsltplayground.com) 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.
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
title: "Welcome to the XSLT Playground blog"
|
||||
description: "What you will find here and how it helps you get more from the online XSLT editor."
|
||||
date: 2025-02-28T00:00:00Z
|
||||
---
|
||||
|
||||
[XSLT Playground](https://xsltplayground.com) 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](https://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/`.
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "Why I built an XSLT online editor for real-world work"
|
||||
description: "The story behind XSLT Playground—an XSLT online editor tuned for multi-parameter transforms, fast feedback, and practical debugging."
|
||||
date: 2025-11-22T15:34:45Z
|
||||
---
|
||||
|
||||
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](https://xsltplayground.com), 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](https://regex101.com) to debug patterns, [base64decode.org](https://www.base64decode.org/) to inspect payloads, and [epochconverter.com](https://www.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](https://jqplay.org)) but purpose-built for XSLT.
|
||||
- Direct access at [xsltplayground.com](https://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.
|
||||
|
||||
## Executive Summary
|
||||
|
||||
- Tool: [XSLT Playground](https://xsltplayground.com) — 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](https://xsltplayground.com) and run your next transform right now.
|
||||
@@ -0,0 +1,38 @@
|
||||
baseURL = "https://blog.xsltplayground.com/"
|
||||
languageCode = "en-us"
|
||||
title = "XSLT Playground"
|
||||
|
||||
[pagination]
|
||||
pagerSize = 10
|
||||
publishDir = "../docs"
|
||||
enableRobotsTXT = true
|
||||
|
||||
[params]
|
||||
subtitle = "Online XSLT editor built for real-world transformations."
|
||||
lead = "Run and debug XSLT online with multi-parameter inputs, timing hints, and fast feedback. This site hosts release notes, guides, and deployment options for XSLT Playground."
|
||||
|
||||
[params.adsense]
|
||||
# Prefer setting ADSENSE_CLIENT and ADSENSE_INARTICLE_SLOT env vars when building if you don't want the values committed.
|
||||
client = "ca-pub-1549720748100858"
|
||||
inArticleSlot = ""
|
||||
|
||||
[menu]
|
||||
[[menu.main]]
|
||||
name = "Home"
|
||||
url = "/"
|
||||
weight = 1
|
||||
|
||||
[[menu.main]]
|
||||
name = "Posts"
|
||||
url = "/posts/"
|
||||
weight = 2
|
||||
|
||||
[[menu.main]]
|
||||
name = "About"
|
||||
url = "/about/"
|
||||
weight = 3
|
||||
|
||||
[[menu.main]]
|
||||
name = "Charts"
|
||||
url = "https://alexandrev.github.io/xslt-lab/index.yaml"
|
||||
weight = 4
|
||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ block "title" . }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
|
||||
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.subtitle }}{{ end }}">
|
||||
{{ partial "adsense/head.html" . }}
|
||||
<link rel="stylesheet" href="{{ "css/main.css" | relURL }}">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-grid">
|
||||
<div>
|
||||
<a class="brand" href="{{ "/" | relURL }}">{{ .Site.Title }}</a>
|
||||
<p class="tagline">{{ .Site.Params.subtitle }}</p>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
{{ range .Site.Menus.main }}
|
||||
<li><a href="{{ .URL }}">{{ .Name }}</a></li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container">
|
||||
{{ block "main" . }}{{ end }}
|
||||
</main>
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-grid">
|
||||
<p>Built with Hugo · {{ now.Format "2006-01-02" }}</p>
|
||||
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
{{ define "main" }}
|
||||
<section class="page-header">
|
||||
<p class="eyebrow">{{ .Section | title }}</p>
|
||||
<h1>{{ .Title }}</h1>
|
||||
{{ with .Description }}<p class="lead">{{ . }}</p>{{ end }}
|
||||
</section>
|
||||
|
||||
<ul class="post-list spaced">
|
||||
{{ range .Paginator.Pages }}
|
||||
<li>
|
||||
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
|
||||
<span class="muted">{{ .Date.Format "02 Jan 2006" }}</span>
|
||||
{{ with .Params.description }}<p class="muted">{{ . }}</p>{{ end }}
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
{{ template "_internal/pagination.html" . }}
|
||||
{{ end }}
|
||||
@@ -0,0 +1,13 @@
|
||||
{{ define "main" }}
|
||||
<article class="post">
|
||||
<p class="eyebrow">{{ .Section | title }}</p>
|
||||
<h1>{{ .Title }}</h1>
|
||||
<p class="muted">{{ .Date.Format "02 Jan 2006" }}</p>
|
||||
{{ with .Params.description }}<p class="lead">{{ . }}</p>{{ end }}
|
||||
{{ partial "adsense/in-article.html" . }}
|
||||
<div class="content">
|
||||
{{ .Content }}
|
||||
</div>
|
||||
<p class="muted back-link"><a href="{{ .CurrentSection.RelPermalink }}">← Back to {{ .CurrentSection.Title }}</a></p>
|
||||
</article>
|
||||
{{ end }}
|
||||
@@ -0,0 +1,42 @@
|
||||
{{ define "main" }}
|
||||
<section class="hero">
|
||||
<p class="eyebrow">Online XSLT Editor</p>
|
||||
<h1>{{ .Title }}</h1>
|
||||
<p class="lead">{{ .Params.description | default .Site.Params.lead }}</p>
|
||||
<div class="cta-row">
|
||||
<a class="button" href="https://xsltplayground.com">Open the playground</a>
|
||||
<a class="button ghost" href="{{ "/posts/" | relURL }}">Read updates</a>
|
||||
<a class="button ghost" href="https://alexandrev.github.io/xslt-lab/index.yaml">Helm chart index</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="grid">
|
||||
<article class="card">
|
||||
<p class="eyebrow">How the playground helps</p>
|
||||
<h2>Built for real XSLT work</h2>
|
||||
<p>Run XSLT online with multiple inputs and parameters, see results as you type, and get timing hints to spot regressions before they hit production.</p>
|
||||
<ul class="checks">
|
||||
<li>Multi-parameter transforms</li>
|
||||
<li>Live execution and inline output</li>
|
||||
<li>Timing to guide optimization</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article class="card">
|
||||
<p class="eyebrow">Latest posts</p>
|
||||
<h2>Recent updates</h2>
|
||||
<ul class="post-list">
|
||||
{{ $posts := first 3 (where .Site.RegularPages "Section" "posts") }}
|
||||
{{ if gt (len $posts) 0 }}
|
||||
{{ range $posts }}
|
||||
<li>
|
||||
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
|
||||
<span class="muted">{{ .Date.Format "02 Jan 2006" }}</span>
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
<li class="muted">No posts yet. Add more in <code>site/content/posts/</code>.</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
{{ end }}
|
||||
@@ -0,0 +1,5 @@
|
||||
{{- $client := or .Site.Params.adsense.client (getenv "ADSENSE_CLIENT") -}}
|
||||
{{- if and $client (ne hugo.Environment "development") -}}
|
||||
<meta name="google-adsense-account" content="{{ $client }}">
|
||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ $client }}" crossorigin="anonymous"></script>
|
||||
{{- end -}}
|
||||
@@ -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") -}}
|
||||
<div class="ad ad-in-article">
|
||||
<ins class="adsbygoogle"
|
||||
style="display:block; text-align:center;"
|
||||
data-ad-layout="in-article"
|
||||
data-ad-format="fluid"
|
||||
data-ad-client="{{ $client }}"
|
||||
data-ad-slot="{{ $slot }}"></ins>
|
||||
</div>
|
||||
<script>
|
||||
(adsbygoogle = window.adsbygoogle || []).push({});
|
||||
</script>
|
||||
{{- end -}}
|
||||
@@ -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") -}}
|
||||
<script async src="https://media.ethicalads.io/media/client/ethicalads.min.js"></script>
|
||||
{{ .Scratch.Set "ethicalads_loaded" true }}
|
||||
{{- end }}
|
||||
<div class="ad-bar">
|
||||
<div class="container ad-bar-inner">
|
||||
<span class="muted">Sponsored</span>
|
||||
<div class="ethical-ad" data-ea-publisher="{{ $publisher }}" data-ea-type="image"></div>
|
||||
</div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
@@ -0,0 +1 @@
|
||||
blog.xsltplayground.com
|
||||
@@ -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; }
|
||||
}
|
||||
Reference in New Issue
Block a user