nodality 1.3.11 → 1.3.13
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/dist/animator.cjs.js +1 -1
- package/dist/animator.cjs.js.LICENSE.txt +1 -1
- package/dist/animator.esm.js +1 -1
- package/dist/animator.esm.js.LICENSE.txt +1 -1
- package/dist/audionew.cjs.js +1 -1
- package/dist/audionew.cjs.js.LICENSE.txt +1 -1
- package/dist/audionew.esm.js +1 -1
- package/dist/audionew.esm.js.LICENSE.txt +1 -1
- package/dist/base.cjs.js +1 -1
- package/dist/base.cjs.js.LICENSE.txt +1 -1
- package/dist/base.esm.js +1 -1
- package/dist/base.esm.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.cjs.js +1 -1
- package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.esm.js +1 -1
- package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.cjs.js +1 -1
- package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.esm.js +1 -1
- package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/bundle.umd.js.LICENSE.txt +1 -1
- package/dist/button.cjs.js +1 -1
- package/dist/button.cjs.js.LICENSE.txt +1 -1
- package/dist/button.esm.js +1 -1
- package/dist/button.esm.js.LICENSE.txt +1 -1
- package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/card-getter.esm.js.LICENSE.txt +1 -1
- package/dist/center.cjs.js +1 -1
- package/dist/center.cjs.js.LICENSE.txt +1 -1
- package/dist/center.esm.js +1 -1
- package/dist/center.esm.js.LICENSE.txt +1 -1
- package/dist/checkbox.cjs.js +1 -1
- package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
- package/dist/checkbox.esm.js +1 -1
- package/dist/checkbox.esm.js.LICENSE.txt +1 -1
- package/dist/code.cjs.js +1 -1
- package/dist/code.cjs.js.LICENSE.txt +1 -1
- package/dist/code.esm.js +1 -1
- package/dist/code.esm.js.LICENSE.txt +1 -1
- package/dist/container.cjs.js +1 -1
- package/dist/container.cjs.js.LICENSE.txt +1 -1
- package/dist/container.esm.js +1 -1
- package/dist/container.esm.js.LICENSE.txt +1 -1
- package/dist/data-list.cjs.js.LICENSE.txt +1 -1
- package/dist/data-list.esm.js.LICENSE.txt +1 -1
- package/dist/designer.cjs.js +1 -1
- package/dist/designer.cjs.js.LICENSE.txt +1 -1
- package/dist/designer.esm.js +1 -1
- package/dist/designer.esm.js.LICENSE.txt +1 -1
- package/dist/element-mapper.cjs.js +1 -1
- package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
- package/dist/element-mapper.esm.js +1 -1
- package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
- package/dist/finalresult.esm.js +1 -1
- package/dist/finalresult.esm.js.LICENSE.txt +1 -1
- package/dist/flex-card.cjs.js +1 -1
- package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-card.esm.js +1 -1
- package/dist/flex-card.esm.js.LICENSE.txt +1 -1
- package/dist/flex-grid.cjs.js +1 -1
- package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-grid.esm.js +1 -1
- package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
- package/dist/flex-row.cjs.js +1 -1
- package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-row.esm.js +1 -1
- package/dist/flex-row.esm.js.LICENSE.txt +1 -1
- package/dist/floating-input.cjs.js +1 -1
- package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
- package/dist/floating-input.esm.js +1 -1
- package/dist/floating-input.esm.js.LICENSE.txt +1 -1
- package/dist/free.cjs.js +1 -1
- package/dist/free.cjs.js.LICENSE.txt +1 -1
- package/dist/free.esm.js +1 -1
- package/dist/free.esm.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
- package/dist/image-picker.cjs.js +1 -1
- package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
- package/dist/image-picker.esm.js +1 -1
- package/dist/image-picker.esm.js.LICENSE.txt +1 -1
- package/dist/image.cjs.js +1 -1
- package/dist/image.cjs.js.LICENSE.txt +1 -1
- package/dist/image.esm.js +1 -1
- package/dist/image.esm.js.LICENSE.txt +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.LICENSE.txt +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
- package/dist/link-getter.cjs.js +1 -1
- package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/link-getter.esm.js +1 -1
- package/dist/link-getter.esm.js.LICENSE.txt +1 -1
- package/dist/link.cjs.js +1 -1
- package/dist/link.cjs.js.LICENSE.txt +1 -1
- package/dist/link.esm.js +1 -1
- package/dist/link.esm.js.LICENSE.txt +1 -1
- package/dist/meta-adder.cjs.js +1 -1
- package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
- package/dist/meta-adder.esm.js +1 -1
- package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
- package/dist/modal-2025.cjs.js +1 -1
- package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/modal-2025.esm.js +1 -1
- package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.cjs.js +1 -1
- package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.esm.js +1 -1
- package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.cjs.js +1 -1
- package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.esm.js +1 -1
- package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/picker.cjs.js +1 -1
- package/dist/picker.cjs.js.LICENSE.txt +1 -1
- package/dist/picker.esm.js +1 -1
- package/dist/picker.esm.js.LICENSE.txt +1 -1
- package/dist/progress.cjs.js +1 -1
- package/dist/progress.cjs.js.LICENSE.txt +1 -1
- package/dist/progress.esm.js +1 -1
- package/dist/progress.esm.js.LICENSE.txt +1 -1
- package/dist/radio.cjs.js +1 -1
- package/dist/radio.cjs.js.LICENSE.txt +1 -1
- package/dist/radio.esm.js +1 -1
- package/dist/radio.esm.js.LICENSE.txt +1 -1
- package/dist/range.cjs.js.LICENSE.txt +1 -1
- package/dist/range.esm.js.LICENSE.txt +1 -1
- package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
- package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
- package/dist/side-bar.cjs.js +1 -1
- package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-bar.esm.js +1 -1
- package/dist/side-bar.esm.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.cjs.js +1 -1
- package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.esm.js +1 -1
- package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/simple-bar.cjs.js +1 -1
- package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/simple-bar.esm.js +1 -1
- package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
- package/dist/slider-2025.cjs.js +1 -1
- package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/slider-2025.esm.js +1 -1
- package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
- package/dist/spacer.cjs.js +1 -1
- package/dist/spacer.cjs.js.LICENSE.txt +1 -1
- package/dist/spacer.esm.js +1 -1
- package/dist/spacer.esm.js.LICENSE.txt +1 -1
- package/dist/stack.cjs.js +1 -1
- package/dist/stack.cjs.js.LICENSE.txt +1 -1
- package/dist/stack.esm.js +1 -1
- package/dist/stack.esm.js.LICENSE.txt +1 -1
- package/dist/stacker.cjs.js.LICENSE.txt +1 -1
- package/dist/stacker.esm.js.LICENSE.txt +1 -1
- package/dist/table.cjs.js +1 -1
- package/dist/table.cjs.js.LICENSE.txt +1 -1
- package/dist/table.esm.js +1 -1
- package/dist/table.esm.js.LICENSE.txt +1 -1
- package/dist/text-field.cjs.js +1 -1
- package/dist/text-field.cjs.js.LICENSE.txt +1 -1
- package/dist/text-field.esm.js +1 -1
- package/dist/text-field.esm.js.LICENSE.txt +1 -1
- package/dist/text.cjs.js +1 -1
- package/dist/text.cjs.js.LICENSE.txt +1 -1
- package/dist/text.esm.js +1 -1
- package/dist/text.esm.js.LICENSE.txt +1 -1
- package/dist/theme.cjs.js.LICENSE.txt +1 -1
- package/dist/theme.esm.js.LICENSE.txt +1 -1
- package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
- package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
- package/dist/ulist.cjs.js +1 -1
- package/dist/ulist.cjs.js.LICENSE.txt +1 -1
- package/dist/ulist.esm.js +1 -1
- package/dist/ulist.esm.js.LICENSE.txt +1 -1
- package/dist/video.cjs.js +1 -1
- package/dist/video.cjs.js.LICENSE.txt +1 -1
- package/dist/video.esm.js +1 -1
- package/dist/video.esm.js.LICENSE.txt +1 -1
- package/dist/wrap.cjs.js +1 -1
- package/dist/wrap.cjs.js.LICENSE.txt +1 -1
- package/dist/wrap.esm.js +1 -1
- package/dist/wrap.esm.js.LICENSE.txt +1 -1
- package/dist/zoom-card.cjs.js +1 -1
- package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
- package/dist/zoom-card.esm.js +1 -1
- package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
- package/layout/animator.js +42 -3
- package/layout/audio.js +21 -1
- package/layout/audionew.js +1 -1
- package/layout/base.js +1 -1
- package/layout/beta-desktop-bar.js +1 -1
- package/layout/beta-mobile-bar.js +1 -1
- package/layout/button.js +4 -2
- package/layout/center.js +1 -1
- package/layout/checkbox.js +1 -1
- package/layout/circle.js +1 -1
- package/layout/code.js +2 -2
- package/layout/container.js +2 -2
- package/layout/dropdown-2025.js +1 -1
- package/layout/flex-card.js +1 -1
- package/layout/flex-grid.js +1 -1
- package/layout/flex-row.js +1 -1
- package/layout/form-components/custom.js +1 -1
- package/layout/form-components/data-list.js +1 -1
- package/layout/form-components/floating-input.js +1 -1
- package/layout/form-components/form-all.js +1 -1
- package/layout/form-components/form.js +1 -1
- package/layout/form-components/image-picker.js +1 -1
- package/layout/form-components/picker.js +1 -1
- package/layout/form-components/radio.js +6 -1
- package/layout/form-components/radiogroup.js +1 -1
- package/layout/form-components/range.js +1 -1
- package/layout/free.js +1 -1
- package/layout/grid-overlay.js +1 -1
- package/layout/grid-switcher.js +3 -1
- package/layout/grid.js +1 -1
- package/layout/horizontal-scroller.js +1 -1
- package/layout/image.js +93 -2
- package/layout/index.js +1 -1
- package/layout/link.js +1 -1
- package/layout/list.js +1 -1
- package/layout/meta-adder.js +1 -1
- package/layout/modal-2025.js +1 -1
- package/layout/morph.js +1 -1
- package/layout/multiswitcher.js +6 -2
- package/layout/nav-bar.js +1 -1
- package/layout/nav-factor/custom-div.js +1 -1
- package/layout/new-nav-bar.js +1 -1
- package/layout/polygon.js +1 -1
- package/layout/prerender-site.js +1 -1
- package/layout/prerender.js +1 -1
- package/layout/progress.js +1 -1
- package/layout/row.js +1 -1
- package/layout/scroll-video.js +1 -1
- package/layout/side-bar.js +1 -1
- package/layout/side-nav-bar.js +6 -1
- package/layout/simple-bar.js +1 -1
- package/layout/slider-2025.js +1 -1
- package/layout/spacer.js +1 -1
- package/layout/stack.js +5 -2
- package/layout/svg.js +1 -1
- package/layout/switcher.js +1 -1
- package/layout/table.js +1 -1
- package/layout/text-field.js +1 -1
- package/layout/text.js +1 -1
- package/layout/ulist.js +1 -1
- package/layout/video.js +1 -1
- package/layout/wrap.js +1 -1
- package/layout/zoom-card.js +1 -1
- package/lib/agent-surface.js +1 -1
- package/lib/card-getter.js +1 -1
- package/lib/check-page.js +1 -1
- package/lib/codegen.js +1 -1
- package/lib/data.js +1 -1
- package/lib/designer.js +1 -1
- package/lib/element-mapper.js +29 -11
- package/lib/element-params.generated.js +4 -4
- package/lib/grid-geometry.js +1 -1
- package/lib/keyframe-animation.js +1 -1
- package/lib/link-getter.js +1 -1
- package/lib/morph-node.js +1 -1
- package/lib/normalize-spec.js +1 -1
- package/lib/parse-html.js +1 -1
- package/lib/raster-inspect.js +1 -1
- package/lib/raster-ops.js +1 -1
- package/lib/raster-presets.js +1 -1
- package/lib/resolve-refs.js +1 -1
- package/lib/scroll-video.js +1 -1
- package/lib/seo.js +1 -1
- package/lib/stacker.js +1 -1
- package/lib/suggest.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/transform-anim.js +1 -1
- package/lib/transition.js +1 -1
- package/lib/validate-nodes.js +1 -1
- package/lib/webmcp-adapter.js +1 -1
- package/package.json +1 -1
- package/schema.json +14 -0
package/layout/image.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
2
|
+
* nodality v1.3.13
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -154,7 +154,7 @@ let obj = options;
|
|
|
154
154
|
options.index && (this.index = options.index);
|
|
155
155
|
options.index && (stra += `\n index: "${options.index}",`);
|
|
156
156
|
|
|
157
|
-
options.resprop && this.resprop(options.resprop);
|
|
157
|
+
options.resprop && this.resprop(options.resprop, options);
|
|
158
158
|
|
|
159
159
|
if (options.centerSelf){
|
|
160
160
|
this.res.style.marginRight = "auto";
|
|
@@ -272,6 +272,9 @@ let obj = options;
|
|
|
272
272
|
options.clipPath && this.clipPath(options.clipPath);
|
|
273
273
|
options.clipPath && (stra += `clipPath: "${options.clipPath}", \n`);
|
|
274
274
|
|
|
275
|
+
//@ img.reveal {object}: Reveal the image through a mask as it scrolls into view: {mask: "square", size: 0.3, duration: "1.2s", easing, zoom: 1.12, offset: 0.2, delay: "0s", once: true}. It starts as a centred square `size` × its shorter side and opens to the full frame once the square rises `offset` of the viewport height above the bottom edge. Owns clip-path and scale while it runs; reduced-motion visitors, and pages with no IntersectionObserver (the prerender), get the image unmasked.
|
|
276
|
+
options.reveal && this.reveal(options.reveal);
|
|
277
|
+
|
|
275
278
|
|
|
276
279
|
// console.log("261");
|
|
277
280
|
// console.warn(obj);
|
|
@@ -674,6 +677,94 @@ if (mqa.matches){
|
|
|
674
677
|
return this;
|
|
675
678
|
}
|
|
676
679
|
|
|
680
|
+
/**
|
|
681
|
+
* Scroll reveal through a mask. The masked state is applied only where it
|
|
682
|
+
* can be undone: with no window, no IntersectionObserver (the jsdom
|
|
683
|
+
* prerender) or a reduced-motion preference the image stays unmasked,
|
|
684
|
+
* because a mask that never opens hides the content for good.
|
|
685
|
+
*
|
|
686
|
+
* The square is a true square: clip-path's inset() percentages resolve
|
|
687
|
+
* per axis, so on a portrait or wide frame a percentage inset draws a
|
|
688
|
+
* rectangle. The insets are measured in px instead and re-measured when
|
|
689
|
+
* the frame resizes; the percentage form is only the pre-layout guess.
|
|
690
|
+
*
|
|
691
|
+
* The zoom uses the `scale` property, not `transform`, so it composes with
|
|
692
|
+
* any transform the page sets instead of overwriting it.
|
|
693
|
+
*/
|
|
694
|
+
reveal(opts) {
|
|
695
|
+
const el = this.res;
|
|
696
|
+
const o = opts && typeof opts === "object" ? opts : {};
|
|
697
|
+
const mask = o.mask ?? "square";
|
|
698
|
+
if (mask !== "square") {
|
|
699
|
+
console.warn(`nodality: img.reveal mask "${mask}" is not supported — use "square".`);
|
|
700
|
+
return this;
|
|
701
|
+
}
|
|
702
|
+
if (typeof window === "undefined" || typeof window.IntersectionObserver !== "function") return this;
|
|
703
|
+
const reduced = typeof window.matchMedia === "function" &&
|
|
704
|
+
window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
705
|
+
if (reduced) return this;
|
|
706
|
+
|
|
707
|
+
const size = Math.min(1, Math.max(0, Number(o.size ?? 0.3)));
|
|
708
|
+
const duration = o.duration ?? "1.2s";
|
|
709
|
+
const easing = o.easing ?? "cubic-bezier(0.76, 0, 0.24, 1)";
|
|
710
|
+
const delay = o.delay ?? "0s";
|
|
711
|
+
const zoom = Number(o.zoom ?? 1.12);
|
|
712
|
+
const once = o.once !== false;
|
|
713
|
+
const transition = ["clip-path", "scale"].map((p) => `${p} ${duration} ${easing} ${delay}`).join(", ");
|
|
714
|
+
|
|
715
|
+
let open = false;
|
|
716
|
+
const closed = () => {
|
|
717
|
+
const w = el.clientWidth, h = el.clientHeight;
|
|
718
|
+
if (!w || !h) return `inset(${(1 - size) * 50}% ${(1 - size) * 50}%)`;
|
|
719
|
+
const s = Math.min(w, h) * size;
|
|
720
|
+
return `inset(${(h - s) / 2}px ${(w - s) / 2}px)`;
|
|
721
|
+
};
|
|
722
|
+
// Re-measuring a closed mask must not animate: the frame's first
|
|
723
|
+
// layout would otherwise play as a 1.2s morph from the guess.
|
|
724
|
+
const settle = () => {
|
|
725
|
+
el.style.transition = "none";
|
|
726
|
+
el.style.clipPath = closed();
|
|
727
|
+
void el.offsetWidth;
|
|
728
|
+
el.style.transition = transition;
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
el.style.clipPath = closed();
|
|
732
|
+
el.style.scale = String(zoom);
|
|
733
|
+
el.style.willChange = "clip-path, scale";
|
|
734
|
+
el.style.transition = transition;
|
|
735
|
+
|
|
736
|
+
const ro = typeof window.ResizeObserver === "function"
|
|
737
|
+
? new window.ResizeObserver(() => { if (!open) settle(); })
|
|
738
|
+
: null;
|
|
739
|
+
ro && ro.observe(el);
|
|
740
|
+
|
|
741
|
+
// Triggered by a LINE, not an area ratio: the browser clips the target
|
|
742
|
+
// by its own clip-path when it measures the intersection, so a closed
|
|
743
|
+
// square never shows more than its own share of the frame (about 8% at
|
|
744
|
+
// size 0.3) and a `threshold` of 0.35 would never be reached. Instead
|
|
745
|
+
// the square opens once it rises `offset` of the viewport above the
|
|
746
|
+
// bottom edge.
|
|
747
|
+
const offset = Math.min(0.9, Math.max(0, Number(o.offset ?? 0.2)));
|
|
748
|
+
const io = new window.IntersectionObserver((entries) => {
|
|
749
|
+
for (const entry of entries) {
|
|
750
|
+
if (entry.isIntersecting && !open) {
|
|
751
|
+
open = true;
|
|
752
|
+
el.style.clipPath = "inset(0px 0px)";
|
|
753
|
+
el.style.scale = "1";
|
|
754
|
+
if (once) { io.disconnect(); ro && ro.disconnect(); }
|
|
755
|
+
} else if (!entry.isIntersecting && open && !once) {
|
|
756
|
+
open = false;
|
|
757
|
+
el.style.clipPath = closed();
|
|
758
|
+
el.style.scale = String(zoom);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
}, { threshold: 0, rootMargin: `0px 0px ${-offset * 100}% 0px` });
|
|
762
|
+
io.observe(el);
|
|
763
|
+
|
|
764
|
+
el.addEventListener("transitionend", () => { if (open && once) el.style.willChange = "auto"; });
|
|
765
|
+
return this;
|
|
766
|
+
}
|
|
767
|
+
|
|
677
768
|
clipPath(pathData) {
|
|
678
769
|
// Create a unique ID for the clip path
|
|
679
770
|
|
package/layout/index.js
CHANGED
package/layout/link.js
CHANGED
package/layout/list.js
CHANGED
package/layout/meta-adder.js
CHANGED
package/layout/modal-2025.js
CHANGED
package/layout/morph.js
CHANGED
package/layout/multiswitcher.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
2
|
+
* nodality v1.3.13
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -57,7 +57,11 @@ str += `{ at: "${this.options.breakpoints[i].at}", view: ${this.options.breakpoi
|
|
|
57
57
|
|
|
58
58
|
// console.log(str);
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
// The id is applied in render(), but only if the generated code carries
|
|
61
|
+
// it — and this used to leave it out, so every nav, sideNav and
|
|
62
|
+
// multiswitcher rendered without the id its element declared.
|
|
63
|
+
const idLine = this._id ? `\n id: ${JSON.stringify(String(this._id))},` : "";
|
|
64
|
+
return [`new Switcher().set({${idLine}
|
|
61
65
|
breakpoints: [
|
|
62
66
|
${str}
|
|
63
67
|
]
|
package/layout/nav-bar.js
CHANGED
package/layout/new-nav-bar.js
CHANGED
package/layout/polygon.js
CHANGED
package/layout/prerender-site.js
CHANGED
package/layout/prerender.js
CHANGED
package/layout/progress.js
CHANGED
package/layout/row.js
CHANGED
package/layout/scroll-video.js
CHANGED
package/layout/side-bar.js
CHANGED
package/layout/side-nav-bar.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
2
|
+
* nodality v1.3.13
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -16,6 +16,11 @@ class SideNav extends Animator {
|
|
|
16
16
|
this.setTags(this.obj.tags);
|
|
17
17
|
this.animate = this.obj.animate !== undefined ? this.obj.animate : true; // could be never false
|
|
18
18
|
this.res = this.createSideNav(obj);
|
|
19
|
+
// SideNav is configured through setup(), not set(), so the base
|
|
20
|
+
// class that applies an element's id after set() never runs here.
|
|
21
|
+
if (obj && obj.id != null && obj.id !== "" && this.res && this.res.setAttribute) {
|
|
22
|
+
this.res.setAttribute("id", String(obj.id));
|
|
23
|
+
}
|
|
19
24
|
this.res.style.position = "relative";
|
|
20
25
|
this.res.style.zIndex = 3;
|
|
21
26
|
this.closed = true; // Set to true initially, so it's closed by default
|
package/layout/simple-bar.js
CHANGED
package/layout/slider-2025.js
CHANGED
package/layout/spacer.js
CHANGED
package/layout/stack.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
2
|
+
* nodality v1.3.13
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -30,6 +30,7 @@ class Stack extends Animator {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
set(obj){
|
|
33
|
+
this.options = obj || {};
|
|
33
34
|
this.setup();
|
|
34
35
|
obj.height && (this.res.style.height = obj.height);
|
|
35
36
|
obj.sticky && this.sticky();
|
|
@@ -57,7 +58,9 @@ class Stack extends Animator {
|
|
|
57
58
|
|
|
58
59
|
toCode() {
|
|
59
60
|
// Initialize the code string with the Stack setup
|
|
60
|
-
|
|
61
|
+
// Was a hardcoded `set({})`, which dropped the element's id.
|
|
62
|
+
const id = this.options && this.options.id;
|
|
63
|
+
let code = `new Stack().set(${id ? `{ id: ${JSON.stringify(String(id))} }` : "{}"})`;
|
|
61
64
|
|
|
62
65
|
// Add child elements
|
|
63
66
|
if (this.children.length > 0) {
|
package/layout/svg.js
CHANGED
package/layout/switcher.js
CHANGED
package/layout/table.js
CHANGED
package/layout/text-field.js
CHANGED
package/layout/text.js
CHANGED
package/layout/ulist.js
CHANGED
package/layout/video.js
CHANGED
package/layout/wrap.js
CHANGED
package/layout/zoom-card.js
CHANGED
package/lib/agent-surface.js
CHANGED
package/lib/card-getter.js
CHANGED
package/lib/check-page.js
CHANGED
package/lib/codegen.js
CHANGED
package/lib/data.js
CHANGED
package/lib/designer.js
CHANGED
package/lib/element-mapper.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
2
|
+
* nodality v1.3.13
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -196,15 +196,28 @@ class ElementMapper { // 22:09:58 04/11/2024
|
|
|
196
196
|
// FilePickera, `container` on Switcher. A mapper that returns
|
|
197
197
|
// emitted CODE rather than an instance (cards, copy) carries the
|
|
198
198
|
// id in the source it emits, and there is no node here to write.
|
|
199
|
+
// The generated code is what Des actually runs, so the id has to
|
|
200
|
+
// be IN it. Most components serialise `this.options` in toCode();
|
|
201
|
+
// a mapper that builds its own options object (table, circle,
|
|
202
|
+
// polygon…) leaves the id out of them, and the rendered element
|
|
203
|
+
// loses it. Put it back before the code is taken.
|
|
204
|
+
//
|
|
205
|
+
// The element's declared id also WINS over one a mapper hardcoded:
|
|
206
|
+
// `free` emitted `id: "#3"` for every free element on a page.
|
|
207
|
+
// SideNav keeps its config in `obj` rather than `options`.
|
|
208
|
+
const declared = String(id);
|
|
209
|
+
if (built && typeof built === "object") {
|
|
210
|
+
if (built.options && typeof built.options === "object") built.options.id = declared;
|
|
211
|
+
if (built.obj && typeof built.obj === "object") built.obj.id = declared;
|
|
212
|
+
}
|
|
199
213
|
const node = built && (built.res || built.formElement || built.el || built.container);
|
|
200
214
|
if (node && typeof node.setAttribute === "function") {
|
|
201
215
|
const current = node.getAttribute("id");
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
//
|
|
206
|
-
if (!current) node.setAttribute("id", String(id)
|
|
207
|
-
else if (current.startsWith("#")) node.setAttribute("id", current.slice(1));
|
|
216
|
+
// Written exactly as declared, hash and all. Ids are compared in
|
|
217
|
+
// normalised form everywhere (see sameId), and the DOM keeps the
|
|
218
|
+
// author's spelling so that a page selecting [id="#hero"] keeps
|
|
219
|
+
// working — normalising here broke exactly such pages.
|
|
220
|
+
if (!current) node.setAttribute("id", String(id));
|
|
208
221
|
}
|
|
209
222
|
}
|
|
210
223
|
return built;
|
|
@@ -515,7 +528,7 @@ animation: {
|
|
|
515
528
|
justifyContent: "center",
|
|
516
529
|
alignItems: "center",
|
|
517
530
|
position: "absolute",
|
|
518
|
-
id: "${obj.el.id ? String(obj.el.id)
|
|
531
|
+
id: "${obj.el.id ? String(obj.el.id) : "#first"}",
|
|
519
532
|
scale: 0.3,
|
|
520
533
|
${ft?.animation ? animation : ""}${
|
|
521
534
|
// Wrapper routes its options through commonMethods(), so a raster
|
|
@@ -1713,7 +1726,7 @@ return new Circle()
|
|
|
1713
1726
|
|
|
1714
1727
|
// Was `{ id: "hex" }` hardcoded, so every polygon on a page rendered the
|
|
1715
1728
|
// same id and none could be targeted individually.
|
|
1716
|
-
let elo = new Polygon({ id: el.id ? String(el.id)
|
|
1729
|
+
let elo = new Polygon({ id: el.id ? String(el.id) : "hex" })
|
|
1717
1730
|
.set({
|
|
1718
1731
|
sides: count,
|
|
1719
1732
|
size: 300,
|
|
@@ -1870,7 +1883,11 @@ return new Circle()
|
|
|
1870
1883
|
|
|
1871
1884
|
|
|
1872
1885
|
|
|
1873
|
-
|
|
1886
|
+
// Arial is the default, not an override: this used to discard
|
|
1887
|
+
// the element's own font, so a link could never match the
|
|
1888
|
+
// page's typography — a nav in the page's mono rendered in
|
|
1889
|
+
// Arial with nothing reported.
|
|
1890
|
+
re["font"] = obj.el.font ?? "Arial";
|
|
1874
1891
|
re["fluidc"] = obj.el.fluidc;
|
|
1875
1892
|
// re["index"] = obj.i + "", // add other options here
|
|
1876
1893
|
|
|
@@ -1887,7 +1904,8 @@ return new Circle()
|
|
|
1887
1904
|
// mapWrap. Link takes `raster` through commonMethods like
|
|
1888
1905
|
// every other component; only the wiring was missing.
|
|
1889
1906
|
re["raster"] = this.filteroRaster(obj.el.id, obj.customOptions);
|
|
1890
|
-
|
|
1907
|
+
// Same pattern: the element's padding wins over the default.
|
|
1908
|
+
re["pad"] = obj.el.pad ?? [{ "a": 10 }];
|
|
1891
1909
|
|
|
1892
1910
|
if (bst.length > 0) {
|
|
1893
1911
|
ela = LinkStyler.style({
|