nodality 1.0.167 → 1.0.170

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 (106) hide show
  1. package/bin/nodality.js +63 -1
  2. package/dist/bundle.umd.js +2 -1
  3. package/dist/bundle.umd.js.LICENSE.txt +33 -0
  4. package/dist/finalresult.esm.js +2 -1
  5. package/dist/finalresult.esm.js.LICENSE.txt +60 -0
  6. package/dist/index.cjs.js +2 -1
  7. package/dist/index.cjs.js.LICENSE.txt +60 -0
  8. package/dist/index.esm.js +2 -1
  9. package/dist/index.esm.js.LICENSE.txt +60 -0
  10. package/layout/animator.js +1 -1
  11. package/layout/audio.js +1 -1
  12. package/layout/audionew.js +1 -1
  13. package/layout/base-2.js +1 -1
  14. package/layout/base.js +1 -1
  15. package/layout/beta-desktop-bar.js +1 -1
  16. package/layout/beta-mobile-bar.js +1 -1
  17. package/layout/box.js +1 -1
  18. package/layout/button.js +1 -1
  19. package/layout/cards.js +1 -1
  20. package/layout/center.js +1 -1
  21. package/layout/checkbox.js +1 -1
  22. package/layout/circle.js +1 -1
  23. package/layout/clean-row.js +1 -1
  24. package/layout/code.js +1 -1
  25. package/layout/container.js +1 -1
  26. package/layout/custom.js +1 -1
  27. package/layout/div-image.js +1 -1
  28. package/layout/dropdown-2025.js +1 -1
  29. package/layout/dropdown.js +1 -1
  30. package/layout/empty-element.js +1 -1
  31. package/layout/external-stylesheet.js +1 -1
  32. package/layout/flex-card.js +1 -1
  33. package/layout/flex-grid.js +1 -1
  34. package/layout/flex-row.js +1 -1
  35. package/layout/footer.js +1 -1
  36. package/layout/form-components/custom.js +1 -1
  37. package/layout/form-components/data-list.js +1 -1
  38. package/layout/form-components/floating-input.js +1 -1
  39. package/layout/form-components/form-all.js +1 -1
  40. package/layout/form-components/form.js +1 -1
  41. package/layout/form-components/image-picker.js +1 -1
  42. package/layout/form-components/picker.js +1 -1
  43. package/layout/form-components/radio.js +1 -1
  44. package/layout/form-components/radiogroup.js +1 -1
  45. package/layout/form-components/range.js +1 -1
  46. package/layout/free.js +1 -1
  47. package/layout/grid-new.js +1 -1
  48. package/layout/grid-switcher.js +1 -1
  49. package/layout/grid.js +1 -1
  50. package/layout/group.js +1 -1
  51. package/layout/header.js +1 -1
  52. package/layout/horizontal-scroller.js +1 -1
  53. package/layout/image-old.js +1 -1
  54. package/layout/image.js +1 -1
  55. package/layout/index.js +24 -2
  56. package/layout/label.js +1 -1
  57. package/layout/link.js +1 -1
  58. package/layout/list-OLD.js +1 -1
  59. package/layout/list.js +1 -1
  60. package/layout/meta-adder.js +1 -1
  61. package/layout/modal-2025.js +1 -1
  62. package/layout/modernwrap.js +1 -1
  63. package/layout/multiswitcher.js +1 -1
  64. package/layout/multiswitcherBeta.js +1 -1
  65. package/layout/nav-bar.js +1 -1
  66. package/layout/nav-factor/custom-div.js +1 -1
  67. package/layout/navBar-OLD.js +1 -1
  68. package/layout/new-flat-adder.js +1 -1
  69. package/layout/new-nav-bar.js +1 -1
  70. package/layout/offset-container.js +1 -1
  71. package/layout/polygon.js +1 -1
  72. package/layout/prerender-site.js +16 -2
  73. package/layout/prerender.js +15 -5
  74. package/layout/progress.js +1 -1
  75. package/layout/row.js +1 -1
  76. package/layout/saved-new-nav-bar.js +1 -1
  77. package/layout/scroll-video.js +1 -1
  78. package/layout/side-bar.js +1 -1
  79. package/layout/side-nav-bar.js +1 -1
  80. package/layout/simple-bar.js +1 -1
  81. package/layout/slider-2025.js +1 -1
  82. package/layout/spacer.js +1 -1
  83. package/layout/stack.js +1 -1
  84. package/layout/styler.js +1 -1
  85. package/layout/svg.js +1 -1
  86. package/layout/switcher.js +1 -1
  87. package/layout/table.js +1 -1
  88. package/layout/text-field.js +1 -1
  89. package/layout/text.js +1 -1
  90. package/layout/ulist.js +1 -1
  91. package/layout/video.js +1 -1
  92. package/layout/without-new.js +1 -1
  93. package/layout/wrap.js +1 -1
  94. package/layout/zoom-card.js +1 -1
  95. package/lib/card-getter.js +1 -1
  96. package/lib/data.js +43 -0
  97. package/lib/designer.js +1 -1
  98. package/lib/element-mapper.js +1 -1
  99. package/lib/keyframe-animation.js +1 -1
  100. package/lib/link-getter.js +1 -1
  101. package/lib/scroll-video.js +1 -1
  102. package/lib/seo.js +198 -0
  103. package/lib/stacker.js +1 -1
  104. package/lib/theme.js +1 -1
  105. package/lib/transform-anim.js +1 -1
  106. package/package.json +4 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
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.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/data.js ADDED
@@ -0,0 +1,43 @@
1
+ /*!
2
+ * nodality v1.0.170
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
+ // `webpackIgnore` keeps webpack from trying to resolve these
13
+ // node-builtin specifiers at bundle time. The browser bundle
14
+ // path is gated by `IS_NODE` above so this code never runs in
15
+ // the browser; webpack just needs to be told not to inline.
16
+ const fs = await import(/* webpackIgnore: true */ "node:fs");
17
+ const path = await import(/* webpackIgnore: true */ "node:path");
18
+ const cwd = process.cwd();
19
+ // Look for the file under `upload/` first (the canonical
20
+ // create-nodality layout), then plain `<name>` at project
21
+ // root as a fallback for non-conventional projects.
22
+ for (const rel of [path.join("upload", name), name]) {
23
+ const abs = path.resolve(cwd, rel);
24
+ if (fs.existsSync(abs)) {
25
+ return JSON.parse(fs.readFileSync(abs, "utf8"));
26
+ }
27
+ }
28
+ throw new Error(`loadJson: ${name} not found (tried ./upload/${name} and ./${name})`);
29
+ }
30
+ const res = await fetch(`./${name}`);
31
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
32
+ return await res.json();
33
+ } catch (err) {
34
+ if (fallback !== undefined) {
35
+ // Soft fail — caller asked for a fallback rather than a throw.
36
+ if (typeof console !== "undefined") {
37
+ console.warn(`[loadJson] ${name} failed (${err?.message ?? err}) — using fallback`);
38
+ }
39
+ return fallback;
40
+ }
41
+ throw err;
42
+ }
43
+ }
package/lib/designer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/seo.js ADDED
@@ -0,0 +1,198 @@
1
+ /*!
2
+ * nodality v1.0.170
3
+ * (c) 2026 Filip Vabrousek
4
+ * License: MIT
5
+ */
6
+
7
+ let configuredOrigin = "";
8
+
9
+ export function setSeoOrigin(origin) {
10
+ configuredOrigin = String(origin ?? "").replace(/\/+$/, "");
11
+ }
12
+
13
+ function resolveOrigin() {
14
+ if (configuredOrigin) return configuredOrigin;
15
+ if (typeof window !== "undefined" && window.location?.origin) {
16
+ return window.location.origin;
17
+ }
18
+ return "";
19
+ }
20
+
21
+ function upsert(selector, build) {
22
+ if (typeof document === "undefined") return;
23
+ // Drop the previously-managed tag (if any) and write a fresh one.
24
+ // Safer than in-place mutation because the static template may have
25
+ // shipped its own <title> or <meta charset>; we own only the
26
+ // `data-seo="1"` set.
27
+ document.head.querySelectorAll(selector).forEach((el) => el.remove());
28
+ const el = build();
29
+ if (el) document.head.appendChild(el);
30
+ }
31
+
32
+ function metaTag(nameAttr, name, content) {
33
+ if (content == null || content === "") return null;
34
+ const m = document.createElement("meta");
35
+ m.setAttribute(nameAttr, name);
36
+ m.setAttribute("content", String(content));
37
+ m.setAttribute("data-seo", "1");
38
+ return m;
39
+ }
40
+
41
+ /**
42
+ * @param {object} opts
43
+ * @param {string} [opts.path] — page path relative to origin ("/" or "/blog/foo")
44
+ * @param {string} [opts.title] — used for OG / Twitter title (NOT <title>)
45
+ * @param {string} [opts.description] — meta description + OG / Twitter description
46
+ * @param {string} [opts.image] — hero image (absolute, or origin-relative starting with "/")
47
+ * @param {string} [opts.ogType] — defaults to "website"; products use "product", articles "article"
48
+ * @param {string} [opts.siteName] — defaults to ""; appears in OG site_name
49
+ * @param {object} [opts.jsonLd] — optional schema.org payload (object or @graph wrapper)
50
+ */
51
+ export function applySeoMeta(opts) {
52
+ if (typeof document === "undefined") return;
53
+
54
+ const origin = resolveOrigin();
55
+ const canonicalUrl = opts.path
56
+ ? (origin ? new URL(opts.path, origin).toString() : opts.path)
57
+ : origin || "";
58
+
59
+ let absoluteImage = null;
60
+ if (opts.image) {
61
+ absoluteImage = /^https?:/i.test(opts.image)
62
+ ? opts.image
63
+ : (origin ? new URL(opts.image, origin).toString() : opts.image);
64
+ }
65
+
66
+ upsert('meta[name="description"][data-seo]', () =>
67
+ metaTag("name", "description", opts.description));
68
+
69
+ upsert('link[rel="canonical"][data-seo]', () => {
70
+ if (!canonicalUrl) return null;
71
+ const l = document.createElement("link");
72
+ l.setAttribute("rel", "canonical");
73
+ l.setAttribute("href", canonicalUrl);
74
+ l.setAttribute("data-seo", "1");
75
+ return l;
76
+ });
77
+
78
+ // Open Graph — Facebook, WhatsApp, iMessage, LinkedIn, Slack.
79
+ upsert('meta[property="og:type"][data-seo]', () =>
80
+ metaTag("property", "og:type", opts.ogType ?? "website"));
81
+ upsert('meta[property="og:title"][data-seo]', () =>
82
+ metaTag("property", "og:title", opts.title));
83
+ upsert('meta[property="og:description"][data-seo]', () =>
84
+ metaTag("property", "og:description", opts.description));
85
+ upsert('meta[property="og:url"][data-seo]', () =>
86
+ metaTag("property", "og:url", canonicalUrl));
87
+ upsert('meta[property="og:image"][data-seo]', () =>
88
+ metaTag("property", "og:image", absoluteImage));
89
+ upsert('meta[property="og:site_name"][data-seo]', () =>
90
+ metaTag("property", "og:site_name", opts.siteName));
91
+
92
+ // Twitter / X — prefers its own tags, falls back to OG.
93
+ upsert('meta[name="twitter:card"][data-seo]', () =>
94
+ metaTag("name", "twitter:card", absoluteImage ? "summary_large_image" : "summary"));
95
+ upsert('meta[name="twitter:title"][data-seo]', () =>
96
+ metaTag("name", "twitter:title", opts.title));
97
+ upsert('meta[name="twitter:description"][data-seo]', () =>
98
+ metaTag("name", "twitter:description", opts.description));
99
+ upsert('meta[name="twitter:image"][data-seo]', () =>
100
+ metaTag("name", "twitter:image", absoluteImage));
101
+
102
+ upsert('script[type="application/ld+json"][data-seo]', () => {
103
+ if (!opts.jsonLd) return null;
104
+ const s = document.createElement("script");
105
+ s.setAttribute("type", "application/ld+json");
106
+ s.setAttribute("data-seo", "1");
107
+ s.textContent = JSON.stringify(opts.jsonLd);
108
+ return s;
109
+ });
110
+ }
111
+
112
+ // ─── JSON-LD builders ──────────────────────────────────────────────
113
+ //
114
+ // Each builder returns a plain object the caller can pass to
115
+ // `applySeoMeta({ jsonLd: ... })`. For pages that need to declare more
116
+ // than one type, wrap them in @graph:
117
+ //
118
+ // applySeoMeta({ jsonLd: { "@context": "https://schema.org",
119
+ // "@graph": [websiteJsonLd({ name, url }), organizationJsonLd({...}) ] } });
120
+
121
+ export function websiteJsonLd({ name, url, inLanguage } = {}) {
122
+ return {
123
+ "@context": "https://schema.org",
124
+ "@type": "WebSite",
125
+ name,
126
+ url,
127
+ ...(inLanguage ? { inLanguage } : {}),
128
+ };
129
+ }
130
+
131
+ export function organizationJsonLd({ name, url, logo, sameAs } = {}) {
132
+ return {
133
+ "@context": "https://schema.org",
134
+ "@type": "Organization",
135
+ name,
136
+ url,
137
+ ...(logo ? { logo } : {}),
138
+ ...(sameAs ? { sameAs } : {}),
139
+ };
140
+ }
141
+
142
+ /**
143
+ * Product schema. `priceCurrency` defaults to USD; pass your own
144
+ * (e.g. "EUR", "CZK") if you ship internationally. `price` is the
145
+ * numeric value as a string (schema.org spec) — pass undefined to
146
+ * omit the offer block entirely.
147
+ */
148
+ export function productJsonLd({ name, description, image, brand, category, sku, url, price, priceCurrency = "USD", availability = "https://schema.org/InStock" } = {}) {
149
+ const ld = {
150
+ "@context": "https://schema.org",
151
+ "@type": "Product",
152
+ name,
153
+ ...(description ? { description } : {}),
154
+ ...(image ? { image: Array.isArray(image) ? image : [image] } : {}),
155
+ ...(brand ? { brand: typeof brand === "string" ? { "@type": "Brand", name: brand } : brand } : {}),
156
+ ...(category ? { category } : {}),
157
+ ...(sku ? { sku } : {}),
158
+ };
159
+ if (price != null) {
160
+ ld.offers = {
161
+ "@type": "Offer",
162
+ ...(url ? { url } : {}),
163
+ priceCurrency,
164
+ price: String(price),
165
+ availability,
166
+ };
167
+ }
168
+ return ld;
169
+ }
170
+
171
+ export function articleJsonLd({ headline, description, image, author, datePublished, dateModified, publisher, url } = {}) {
172
+ return {
173
+ "@context": "https://schema.org",
174
+ "@type": "Article",
175
+ headline,
176
+ ...(description ? { description } : {}),
177
+ ...(image ? { image: Array.isArray(image) ? image : [image] } : {}),
178
+ ...(author ? { author: typeof author === "string" ? { "@type": "Person", name: author } : author } : {}),
179
+ ...(datePublished ? { datePublished } : {}),
180
+ ...(dateModified ? { dateModified } : {}),
181
+ ...(publisher ? { publisher: typeof publisher === "string" ? { "@type": "Organization", name: publisher } : publisher } : {}),
182
+ ...(url ? { mainEntityOfPage: url } : {}),
183
+ };
184
+ }
185
+
186
+ /** items: [{ name, url }, ...] in breadcrumb order (root → leaf). */
187
+ export function breadcrumbJsonLd(items = []) {
188
+ return {
189
+ "@context": "https://schema.org",
190
+ "@type": "BreadcrumbList",
191
+ itemListElement: items.map((it, i) => ({
192
+ "@type": "ListItem",
193
+ position: i + 1,
194
+ name: it.name,
195
+ item: it.url,
196
+ })),
197
+ };
198
+ }
package/lib/stacker.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/theme.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.167
2
+ * nodality v1.0.170
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodality",
3
- "version": "1.0.167",
3
+ "version": "1.0.170",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -19,7 +19,9 @@
19
19
  "import": "./dist/index.esm.js"
20
20
  },
21
21
  "./ssg": "./layout/prerender.js",
22
- "./ssg-site": "./layout/prerender-site.js"
22
+ "./ssg-site": "./layout/prerender-site.js",
23
+ "./seo": "./lib/seo.js",
24
+ "./data": "./lib/data.js"
23
25
  },
24
26
  "publishConfig": {
25
27
  "access": "public",