kandown 0.21.2 → 0.21.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/bin/kandown.js +42 -0
- package/dist/android-chrome-192x192.png +0 -0
- package/dist/android-chrome-512x512.png +0 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/favicon-16x16.png +0 -0
- package/dist/favicon-32x32.png +0 -0
- package/dist/favicon-48x48.png +0 -0
- package/dist/favicon-96x96.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/favicon.svg +18 -38
- package/dist/index.html +6 -2
- package/dist/logo.svg +19 -0
- package/dist/site.webmanifest +35 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.21.6 — 2026-07-20 — "Favicons & CI Workflow Fix"
|
|
4
|
+
|
|
5
|
+
- **Added**: **Official Favicon Suite from `logo.svg`** — generated multi-format favicons (`favicon.svg`, inline base64 SVG data URI, `favicon.ico`, `favicon-16x16.png`, `favicon-32x32.png`, `favicon-48x48.png`, `favicon-96x96.png`), `apple-touch-icon.png` (180x180), `android-chrome-192x192.png`, `android-chrome-512x512.png`, and Web Manifests (`manifest.json`, `site.webmanifest`).
|
|
6
|
+
- **Added**: **Daemon Static Asset Handler** — added `serveStaticAsset` in `bin/kandown.js` so web daemons serve app favicons and manifests directly.
|
|
7
|
+
- **Fixed**: **CI Publish Workflow** — updated `.github/workflows/publish.yml` to use `pnpm install --no-frozen-lockfile` to prevent lockfile version mismatch failures across runner environments.
|
|
8
|
+
|
|
9
|
+
## 0.21.3 — 2026-07-20 — "Editor Text Colors & Highlights"
|
|
10
|
+
|
|
11
|
+
- **Fixed**: **Editor Text & Highlight Color Persistence** — enabled `textColor` and `backgroundColor` specs in BlockNote schema (`src/components/ui/BlockNoteMarkdownEditor.tsx`) so inline text colors and background highlights added in the web task description editor serialize to HTML inline tags and persist cleanly across reloads and markdown round-trips.
|
|
12
|
+
|
|
3
13
|
## 0.21.2 — 2026-07-20 — "Pre-Bump Manual Validation"
|
|
4
14
|
|
|
5
15
|
- **Added**: **Mandatory Pre-Bump Testing Rule in `AGENTS.md`** — formal rule requiring agents to manually launch and test `kandown` CLI and web daemon before executing a release bump to catch runtime errors.
|
package/bin/kandown.js
CHANGED
|
@@ -2507,6 +2507,47 @@ function serveApp(res, kandownDir) {
|
|
|
2507
2507
|
* It serves the single-file web app and exposes placeholder API routes for the
|
|
2508
2508
|
* follow-up REST task, keeping this refactor limited to server bootstrapping.
|
|
2509
2509
|
*/
|
|
2510
|
+
const ASSET_MIME_TYPES = {
|
|
2511
|
+
'.svg': 'image/svg+xml',
|
|
2512
|
+
'.png': 'image/png',
|
|
2513
|
+
'.ico': 'image/x-icon',
|
|
2514
|
+
'.json': 'application/json',
|
|
2515
|
+
'.webmanifest': 'application/manifest+json',
|
|
2516
|
+
};
|
|
2517
|
+
|
|
2518
|
+
function serveStaticAsset(req, res, pathname) {
|
|
2519
|
+
const fileBasename = pathname.replace(/^\//, '');
|
|
2520
|
+
if (!fileBasename || fileBasename.includes('..')) return false;
|
|
2521
|
+
const assetPath = join(PKG_ROOT, 'public', fileBasename);
|
|
2522
|
+
if (existsSync(assetPath) && statSync(assetPath).isFile()) {
|
|
2523
|
+
const ext = extname(assetPath).toLowerCase();
|
|
2524
|
+
const contentType = ASSET_MIME_TYPES[ext] || 'application/octet-stream';
|
|
2525
|
+
try {
|
|
2526
|
+
handleCors(res);
|
|
2527
|
+
const content = readFileSync(assetPath);
|
|
2528
|
+
if (req.method === 'HEAD') {
|
|
2529
|
+
res.writeHead(200, {
|
|
2530
|
+
'Content-Type': contentType,
|
|
2531
|
+
'Content-Length': content.length,
|
|
2532
|
+
'Cache-Control': 'public, max-age=86400',
|
|
2533
|
+
});
|
|
2534
|
+
res.end();
|
|
2535
|
+
return true;
|
|
2536
|
+
}
|
|
2537
|
+
res.writeHead(200, {
|
|
2538
|
+
'Content-Type': contentType,
|
|
2539
|
+
'Content-Length': content.length,
|
|
2540
|
+
'Cache-Control': 'public, max-age=86400',
|
|
2541
|
+
});
|
|
2542
|
+
res.end(content);
|
|
2543
|
+
return true;
|
|
2544
|
+
} catch {
|
|
2545
|
+
return false;
|
|
2546
|
+
}
|
|
2547
|
+
}
|
|
2548
|
+
return false;
|
|
2549
|
+
}
|
|
2550
|
+
|
|
2510
2551
|
function createServeServer(kandownDir) {
|
|
2511
2552
|
try {
|
|
2512
2553
|
const tasksDir = getTasksDir(kandownDir);
|
|
@@ -2530,6 +2571,7 @@ function createServeServer(kandownDir) {
|
|
|
2530
2571
|
if (requestUrl.pathname.startsWith('/api/')) {
|
|
2531
2572
|
return handleApi(req, res, requestUrl, kandownDir);
|
|
2532
2573
|
}
|
|
2574
|
+
if (serveStaticAsset(req, res, requestUrl.pathname)) return;
|
|
2533
2575
|
return writeText(res, 404, 'Not found');
|
|
2534
2576
|
});
|
|
2535
2577
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/favicon-16x16.png
CHANGED
|
Binary file
|
package/dist/favicon-32x32.png
CHANGED
|
Binary file
|
package/dist/favicon-48x48.png
CHANGED
|
Binary file
|
|
Binary file
|
package/dist/favicon.ico
CHANGED
|
Binary file
|
package/dist/favicon.svg
CHANGED
|
@@ -1,39 +1,19 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<title>Kandown</title>
|
|
20
|
-
<style>
|
|
21
|
-
.k { fill: #0a0a0a; }
|
|
22
|
-
.slash { fill: #cef867; }
|
|
23
|
-
@media (prefers-color-scheme: dark) {
|
|
24
|
-
.k { fill: #ffffff; }
|
|
25
|
-
}
|
|
26
|
-
</style>
|
|
27
|
-
|
|
28
|
-
<!-- K vertical bar (left stem) -->
|
|
29
|
-
<rect class="k" x="50" y="36" width="34" height="184" rx="3" ry="3"/>
|
|
30
|
-
|
|
31
|
-
<!-- K upper diagonal: middle-left → top-right -->
|
|
32
|
-
<path class="k" d="M 84 128 L 200 36 L 222 36 L 84 152 Z"/>
|
|
33
|
-
|
|
34
|
-
<!-- K lower diagonal: middle-left → bottom-right (with the small flag/notch on the right) -->
|
|
35
|
-
<path class="k" d="M 84 128 L 200 220 L 222 220 L 188 186 L 200 174 L 84 132 Z"/>
|
|
36
|
-
|
|
37
|
-
<!-- Lime diagonal slash: thick parallelogram from top-right to bottom-left -->
|
|
38
|
-
<path class="slash" d="M 232 22 L 174 22 L 24 172 L 24 230 Z"/>
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
+
<svg width="100%" height="100%" viewBox="0 0 150 150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
4
|
+
<path d="M148,21.594L148,128.406C148,139.22 139.22,148 128.406,148L21.594,148C10.78,148 2,139.22 2,128.406L2,21.594C2,10.78 10.78,2 21.594,2L128.406,2C139.22,2 148,10.78 148,21.594Z" style="fill:url(#_Linear1);"/>
|
|
5
|
+
<g transform="matrix(0.823551,0,0,0.823551,12.830775,11.282318)">
|
|
6
|
+
<g transform="matrix(1.620982,0,0,1.566239,-41.718998,-41.628205)">
|
|
7
|
+
<path d="M56.491,62.601C57.2,61.897 57.602,60.925 57.606,59.908C57.627,53.936 57.7,33.2 57.7,33.2C57.6,29.7 55,27.6 52,27.6L42.075,27.6C38.544,27.6 35.673,30.547 35.644,34.201C35.528,48.996 35.327,83.484 35.956,83.013C35.956,83.013 52.072,66.994 56.491,62.601Z" style="fill:rgb(252,255,239);fill-rule:nonzero;"/>
|
|
8
|
+
</g>
|
|
9
|
+
<g transform="matrix(1.566239,0,0,1.566239,-39.774573,-41.628205)">
|
|
10
|
+
<path d="M87.6,43.8C84.2,43.9 80.5,45.1 77.7,47.5L39.2,86.2C37.1,88.3 35.8,91 35.7,93.7L35.7,116.574C35.7,117.219 36.088,117.802 36.683,118.051C37.278,118.3 37.965,118.167 38.425,117.714C50.467,105.842 98.836,58.16 110.608,46.555C111.047,46.122 111.185,45.468 110.956,44.894C110.728,44.321 110.178,43.94 109.561,43.928C106.663,43.871 103.089,43.8 103.089,43.8L87.6,43.8Z" style="fill:rgb(241,255,184);fill-rule:nonzero;"/>
|
|
11
|
+
</g>
|
|
12
|
+
<g transform="matrix(0.766318,0.766329,-1.302872,1.302853,170.442469,-47.541879)">
|
|
13
|
+
<path d="M38.038,101.45C35.808,101.45 34,100.387 34,99.075C34,95.326 34,88.102 34,84.58C34,84.042 34.364,83.525 35.011,83.145C35.658,82.764 36.536,82.55 37.452,82.55C46.372,82.55 69.5,82.55 69.5,82.55C69.5,82.55 69.5,77.52 69.5,74.389C69.5,73.947 69.936,73.545 70.617,73.359C71.298,73.173 72.101,73.236 72.675,73.521C80.028,77.17 98.075,86.125 104.279,89.204C104.832,89.479 105.168,89.876 105.206,90.301C105.245,90.727 104.982,91.143 104.481,91.45C98.972,94.832 83.072,104.591 75.013,109.539C74.195,110.041 72.946,110.206 71.841,109.959C70.737,109.712 69.99,109.101 69.946,108.406C69.744,105.262 69.5,101.45 69.5,101.45L38.038,101.45Z" style="fill:rgb(136,225,56);"/>
|
|
14
|
+
</g>
|
|
15
|
+
</g>
|
|
16
|
+
<defs>
|
|
17
|
+
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(62,131,-131,62,9,8)"><stop offset="0" style="stop-color:rgb(12,29,23);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(24,41,35);stop-opacity:1"/></linearGradient>
|
|
18
|
+
</defs>
|
|
39
19
|
</svg>
|