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 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
Binary file
Binary file
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
- @file public/favicon.svg
4
- @description Kandown brand mark adaptive favicon.
5
- 📖 Transparent background so the icon adapts to the browser's tab-strip
6
- color (no more black-on-black on dark themes). The K recolors itself
7
- via @media (prefers-color-scheme: dark) so the contrast holds in both
8
- light and dark browser themes:
9
- light browser: dark K (#0a0a0a) on white/cream tab → high contrast
10
- dark browser: white K (#ffffff) on dark tab → high contrast
11
- The lime slash (#cef867) is the constant brand element on top.
12
- 📖 PNG fallbacks (16/32/48/ico) ship in the light-mode variant (dark K on
13
- transparent) for browsers that don't honor SVG media queries. PWA /
14
- OS-launcher icons (apple-touch, android-chrome, mstile, og-image)
15
- still use the dark surface — those have a different use case (solid
16
- background required by the platform).
17
- -->
18
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-label="Kandown">
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>