nodality 1.0.166 → 1.0.168

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.
Files changed (98) hide show
  1. package/bin/nodality.js +312 -0
  2. package/layout/animator.js +1 -1
  3. package/layout/audio.js +1 -1
  4. package/layout/audionew.js +1 -1
  5. package/layout/base-2.js +1 -1
  6. package/layout/base.js +1 -1
  7. package/layout/beta-desktop-bar.js +1 -1
  8. package/layout/beta-mobile-bar.js +1 -1
  9. package/layout/box.js +1 -1
  10. package/layout/button.js +1 -1
  11. package/layout/cards.js +1 -1
  12. package/layout/center.js +1 -1
  13. package/layout/checkbox.js +1 -1
  14. package/layout/circle.js +1 -1
  15. package/layout/clean-row.js +1 -1
  16. package/layout/code.js +1 -1
  17. package/layout/container.js +1 -1
  18. package/layout/custom.js +1 -1
  19. package/layout/div-image.js +1 -1
  20. package/layout/dropdown-2025.js +1 -1
  21. package/layout/dropdown.js +1 -1
  22. package/layout/empty-element.js +1 -1
  23. package/layout/external-stylesheet.js +1 -1
  24. package/layout/flex-card.js +1 -1
  25. package/layout/flex-grid.js +1 -1
  26. package/layout/flex-row.js +1 -1
  27. package/layout/footer.js +1 -1
  28. package/layout/form-components/custom.js +1 -1
  29. package/layout/form-components/data-list.js +1 -1
  30. package/layout/form-components/floating-input.js +1 -1
  31. package/layout/form-components/form-all.js +1 -1
  32. package/layout/form-components/form.js +1 -1
  33. package/layout/form-components/image-picker.js +1 -1
  34. package/layout/form-components/picker.js +1 -1
  35. package/layout/form-components/radio.js +1 -1
  36. package/layout/form-components/radiogroup.js +1 -1
  37. package/layout/form-components/range.js +1 -1
  38. package/layout/free.js +1 -1
  39. package/layout/grid-new.js +1 -1
  40. package/layout/grid-switcher.js +1 -1
  41. package/layout/grid.js +1 -1
  42. package/layout/group.js +1 -1
  43. package/layout/header.js +1 -1
  44. package/layout/horizontal-scroller.js +1 -1
  45. package/layout/image-old.js +1 -1
  46. package/layout/image.js +1 -1
  47. package/layout/index.js +1 -1
  48. package/layout/label.js +1 -1
  49. package/layout/link.js +1 -1
  50. package/layout/list-OLD.js +1 -1
  51. package/layout/list.js +1 -1
  52. package/layout/meta-adder.js +1 -1
  53. package/layout/modal-2025.js +1 -1
  54. package/layout/modernwrap.js +1 -1
  55. package/layout/multiswitcher.js +1 -1
  56. package/layout/multiswitcherBeta.js +1 -1
  57. package/layout/nav-bar.js +1 -1
  58. package/layout/nav-factor/custom-div.js +1 -1
  59. package/layout/navBar-OLD.js +1 -1
  60. package/layout/new-flat-adder.js +1 -1
  61. package/layout/new-nav-bar.js +1 -1
  62. package/layout/offset-container.js +1 -1
  63. package/layout/polygon.js +1 -1
  64. package/layout/prerender-site.js +16 -2
  65. package/layout/prerender.js +15 -5
  66. package/layout/progress.js +1 -1
  67. package/layout/row.js +1 -1
  68. package/layout/saved-new-nav-bar.js +1 -1
  69. package/layout/scroll-video.js +1 -1
  70. package/layout/side-bar.js +1 -1
  71. package/layout/side-nav-bar.js +1 -1
  72. package/layout/simple-bar.js +1 -1
  73. package/layout/slider-2025.js +1 -1
  74. package/layout/spacer.js +1 -1
  75. package/layout/stack.js +1 -1
  76. package/layout/styler.js +1 -1
  77. package/layout/svg.js +1 -1
  78. package/layout/switcher.js +1 -1
  79. package/layout/table.js +1 -1
  80. package/layout/text-field.js +1 -1
  81. package/layout/text.js +1 -1
  82. package/layout/ulist.js +1 -1
  83. package/layout/video.js +1 -1
  84. package/layout/without-new.js +1 -1
  85. package/layout/wrap.js +1 -1
  86. package/layout/zoom-card.js +1 -1
  87. package/lib/card-getter.js +1 -1
  88. package/lib/data.js +48 -0
  89. package/lib/designer.js +1 -1
  90. package/lib/element-mapper.js +1 -1
  91. package/lib/keyframe-animation.js +1 -1
  92. package/lib/link-getter.js +1 -1
  93. package/lib/scroll-video.js +1 -1
  94. package/lib/seo.js +198 -0
  95. package/lib/stacker.js +1 -1
  96. package/lib/theme.js +1 -1
  97. package/lib/transform-anim.js +1 -1
  98. package/package.json +4 -2
package/layout/group.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/header.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/image.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/label.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/link.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/list.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/nav-bar.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/polygon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -146,6 +146,16 @@ export async function prerenderSite(config) {
146
146
  await runChild(config, locale);
147
147
  const elapsed = ((Date.now() - startedAt) / 1000).toFixed(1);
148
148
  console.log(`✅ Prerender done in ${elapsed}s — ${config.pages.length} page(s)`);
149
+ // Single-locale sitemap (1.0.168+). Earlier versions only wrote
150
+ // a sitemap on multi-locale builds, so single-locale projects had
151
+ // to bolt on their own `scripts/generate-sitemap.mjs`. We now
152
+ // emit on every build unless the caller explicitly opts out
153
+ // with `sitemap: false`. URLs are origin + page.html, lastmod is
154
+ // build time, no hreflang (single locale has nothing to alternate).
155
+ if (config.sitemap !== false) {
156
+ await writeSitemap(config);
157
+ console.log(`✅ Sitemap regenerated — ${config.pages.length} URL(s)`);
158
+ }
149
159
  return;
150
160
  }
151
161
 
@@ -399,6 +409,10 @@ function urlFor(config, locale, page) {
399
409
 
400
410
  /** hreflang alternates for one page (all locales + x-default). */
401
411
  function alternatesFor(config, page) {
412
+ // Single-locale builds (incl. the implicit untagged-locale case)
413
+ // have nothing to alternate to — emitting `xhtml:link rel="alternate"`
414
+ // with the same URL as the `<loc>` would just clutter the sitemap.
415
+ if (config.locales.length <= 1) return [];
402
416
  const xDefault = config.xDefaultLocale || config.defaultLocale;
403
417
  const alts = config.locales.map((l) => ({ hreflang: l, href: urlFor(config, l, page) }));
404
418
  alts.push({ hreflang: "x-default", href: urlFor(config, xDefault, page) });
@@ -427,7 +441,7 @@ async function writeSitemap(config) {
427
441
  ` <lastmod>${now}</lastmod>\n` +
428
442
  ` <changefreq>${changefreq}</changefreq>\n` +
429
443
  ` <priority>${priority}</priority>\n` +
430
- altLines + "\n" +
444
+ (altLines ? altLines + "\n" : "") +
431
445
  ` </url>`
432
446
  );
433
447
  }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -312,11 +312,21 @@ export async function prerender({
312
312
  "requestAnimationFrame", "cancelAnimationFrame", "getComputedStyle",
313
313
  "fetch", "dataLayer", "gtag",
314
314
  "DOMParser", "XMLSerializer", "Range", "NodeFilter",
315
+ // `SVGElement` is bridged so library code that does
316
+ // `obj.svg instanceof SVGElement` (button.js, custom icons, …)
317
+ // doesn't throw `ReferenceError: SVGElement is not defined` under
318
+ // jsdom. The previous policy of NOT shimming it caused per-page
319
+ // render aborts on every detail page that used a UList with
320
+ // bullets — projects had to drop a `globalThis.SVGElement = class
321
+ // {}` stub into `_globals.js` to paper over it. SVG-related
322
+ // checks return `false` for non-real-SVG values at SSG time, same
323
+ // as in the browser when the value isn't an SVG node.
324
+ "SVGElement", "SVGSVGElement",
315
325
  // Deliberately NOT shimming the browser `Image` / `HTMLImageElement`
316
- // / `SVGElement` constructors — Nodality exports its own `Image`
317
- // class and `nodality/_globals.js` writes it to `globalThis`. The
318
- // browser-constructor copies would clobber it and break every
319
- // `new Image().set(…)` call in the entries.
326
+ // constructors — Nodality exports its own `Image` class and
327
+ // `nodality/_globals.js` writes it to `globalThis`. The browser
328
+ // copies would clobber it and break every `new Image().set(…)`
329
+ // call in the entries.
320
330
  ];
321
331
  // Some Node versions (22+) make certain globals — most notably
322
332
  // `navigator` — getter-only on `globalThis`, which means a plain
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/row.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/spacer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/stack.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/styler.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/svg.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/table.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/text.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/ulist.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/video.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/wrap.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/data.js ADDED
@@ -0,0 +1,48 @@
1
+ /*!
2
+ * nodality v1.0.168
3
+ * (c) 2026 Filip Vabrousek
4
+ * License: MIT
5
+ */
6
+
7
+ const IS_NODE = typeof process !== "undefined" && !!process.versions?.node;
8
+
9
+ export async function loadJson(name, { fallback = undefined } = {}) {
10
+ try {
11
+ if (IS_NODE) {
12
+ // ESM JSON imports require the `with { type: "json" }` attribute.
13
+ // The path is interpreted relative to THIS file's URL, so the
14
+ // page entry's `upload/pages/` location implicitly resolves to
15
+ // `upload/<name>`. Consumers don't need to think about it.
16
+ const mod = await import(`./../../upload/${name}`, { with: { type: "json" } })
17
+ .catch(async () => {
18
+ // Fall back to a relative-from-cwd resolution for projects
19
+ // that don't follow the `upload/` convention. Same shape;
20
+ // process.cwd() is the project root at prerender time.
21
+ const fs = await import("node:fs");
22
+ const path = await import("node:path");
23
+ const cwd = process.cwd();
24
+ // Try upload/<name> then plain <name>.
25
+ for (const rel of [path.join("upload", name), name]) {
26
+ const abs = path.resolve(cwd, rel);
27
+ if (fs.existsSync(abs)) {
28
+ return { default: JSON.parse(fs.readFileSync(abs, "utf8")) };
29
+ }
30
+ }
31
+ throw new Error(`loadJson: ${name} not found (tried ./upload/${name} and ./${name})`);
32
+ });
33
+ return mod.default ?? mod;
34
+ }
35
+ const res = await fetch(`./${name}`);
36
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
37
+ return await res.json();
38
+ } catch (err) {
39
+ if (fallback !== undefined) {
40
+ // Soft fail — caller asked for a fallback rather than a throw.
41
+ if (typeof console !== "undefined") {
42
+ console.warn(`[loadJson] ${name} failed (${err?.message ?? err}) — using fallback`);
43
+ }
44
+ return fallback;
45
+ }
46
+ throw err;
47
+ }
48
+ }
package/lib/designer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.166
2
+ * nodality v1.0.168
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */