@noirmd/previewer 2.0.4 → 2.1.0

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.
@@ -1,110 +1,80 @@
1
1
  /* ============================================================
2
2
  NoirMD Vanilla — Hover Gallery
3
+
4
+ Stacked images with invisible trigger strips.
5
+ JS toggles a `.nr-hg-active` class on the visible image.
6
+ CSS handles the crossfade transition.
3
7
  ============================================================ */
4
8
 
9
+ /* ── Container ──────────────────────────────────────────────── */
10
+
5
11
  .nr-hover-gallery {
6
- --items: 1;
7
- display: inline-grid;
8
- grid-template-columns: repeat(var(--items), 1fr);
12
+ position: relative;
9
13
  width: 100%;
10
14
  max-width: 100%;
11
- gap: 1px;
15
+ aspect-ratio: 16 / 9;
12
16
  overflow: hidden;
13
17
  border-radius: var(--nr-radius-sm);
14
18
  background: var(--nr-bg-secondary);
15
19
  margin: 1rem 0;
16
20
  }
17
21
 
18
- .nr-hover-gallery:has(> :nth-child(3)) {
19
- --items: 2;
20
- }
21
-
22
- .nr-hover-gallery:has(> :nth-child(4)) {
23
- --items: 3;
24
- }
25
-
26
- .nr-hover-gallery:has(> :nth-child(5)) {
27
- --items: 4;
28
- }
29
-
30
- .nr-hover-gallery:has(> :nth-child(6)) {
31
- --items: 5;
32
- }
33
-
34
- .nr-hover-gallery:has(> :nth-child(7)) {
35
- --items: 6;
36
- }
22
+ /* ── Images (stacked) ───────────────────────────────────────── */
37
23
 
38
- .nr-hover-gallery:has(> :nth-child(8)) {
39
- --items: 7;
40
- }
41
-
42
- .nr-hover-gallery:has(> :nth-child(9)) {
43
- --items: 8;
44
- }
45
-
46
- .nr-hover-gallery:has(> :nth-child(10)) {
47
- --items: 9;
48
- }
49
-
50
- .nr-hover-gallery > * {
51
- opacity: 0;
24
+ .nr-hover-gallery > img {
25
+ position: absolute;
26
+ inset: 0;
27
+ width: 100%;
52
28
  height: 100%;
53
- grid-row: 1;
54
29
  object-fit: cover;
55
- width: 100%;
30
+ opacity: 0;
31
+ transition: opacity 0.4s ease;
32
+ pointer-events: none;
56
33
  }
57
34
 
58
- .nr-hover-gallery > :nth-child(1) {
59
- grid-column: 1 / -1;
35
+ .nr-hover-gallery > img.nr-hg-active {
60
36
  opacity: 1;
61
37
  }
62
38
 
63
- .nr-hover-gallery > :nth-child(2) {
64
- grid-column: 1;
65
- }
39
+ /* ── Trigger strips (invisible, full-height) ────────────────── */
66
40
 
67
- .nr-hover-gallery > :nth-child(3) {
68
- grid-column: 2;
69
- }
70
-
71
- .nr-hover-gallery > :nth-child(4) {
72
- grid-column: 3;
73
- }
74
-
75
- .nr-hover-gallery > :nth-child(5) {
76
- grid-column: 4;
77
- }
78
-
79
- .nr-hover-gallery > :nth-child(6) {
80
- grid-column: 5;
81
- }
82
-
83
- .nr-hover-gallery > :nth-child(7) {
84
- grid-column: 6;
41
+ .nr-hover-gallery > .nr-hg-trigger {
42
+ position: absolute;
43
+ top: 0;
44
+ bottom: 0;
45
+ height: 100%;
46
+ z-index: 1;
85
47
  }
86
48
 
87
- .nr-hover-gallery > :nth-child(8) {
88
- grid-column: 7;
89
- }
49
+ /* ── Indicator dots ─────────────────────────────────────────── */
90
50
 
91
- .nr-hover-gallery > :nth-child(9) {
92
- grid-column: 8;
51
+ .nr-hover-gallery > .nr-hg-dots {
52
+ position: absolute;
53
+ bottom: 0.5rem;
54
+ left: 50%;
55
+ transform: translateX(-50%);
56
+ display: flex;
57
+ gap: 0.35rem;
58
+ z-index: 2;
59
+ pointer-events: none;
93
60
  }
94
61
 
95
- .nr-hover-gallery > :nth-child(10) {
96
- grid-column: 9;
62
+ .nr-hover-gallery > .nr-hg-dots > span {
63
+ width: 6px;
64
+ height: 6px;
65
+ border-radius: 50%;
66
+ background: rgba(255, 255, 255, 0.4);
67
+ transition: background 0.3s ease, transform 0.3s ease;
97
68
  }
98
69
 
99
- .nr-hover-gallery > :nth-child(n + 11) {
100
- display: none;
70
+ .nr-hover-gallery > .nr-hg-dots > span.nr-hg-dot-active {
71
+ background: rgba(255, 255, 255, 0.95);
72
+ transform: scale(1.3);
101
73
  }
102
74
 
103
- .nr-hover-gallery > *:hover {
104
- grid-column: 1 / -1;
105
- opacity: 1;
106
- }
75
+ /* ── Cap at 10 images ───────────────────────────────────────── */
107
76
 
108
- .nr-hover-gallery:has(*:hover) > :nth-child(1) {
77
+ .nr-hover-gallery > img:nth-of-type(n + 11),
78
+ .nr-hover-gallery > .nr-hg-trigger:nth-of-type(n + 11) {
109
79
  display: none;
110
80
  }
package/dist/index.cjs CHANGED
@@ -11953,6 +11953,7 @@ var hover3d_default = hover3dDirective;
11953
11953
 
11954
11954
  // vanilla/directives/hovergallery.ts
11955
11955
  var IMG_RE3 = /!\[([^\]]*)\]\(([^)]+)\)/g;
11956
+ var MAX_IMAGES = 10;
11956
11957
  var hovergalleryDirective = ({ props, slots }) => {
11957
11958
  const images = [];
11958
11959
  const raw = slots.default || "";
@@ -11964,18 +11965,56 @@ var hovergalleryDirective = ({ props, slots }) => {
11964
11965
  if (images.length === 0) {
11965
11966
  return document.createDocumentFragment();
11966
11967
  }
11968
+ const count = Math.min(images.length, MAX_IMAGES);
11967
11969
  const figure = document.createElement("figure");
11968
11970
  figure.className = "nr-hover-gallery";
11969
11971
  if (props.aspect) figure.style.aspectRatio = props.aspect;
11970
11972
  if (props.class) figure.classList.add(...props.class.split(/\s+/).filter(Boolean));
11971
- if (props.style) figure.setAttribute("style", props.style);
11972
- for (const img of images) {
11973
+ if (props.style) figure.setAttribute("style", (figure.getAttribute("style") || "") + ";" + props.style);
11974
+ const imgEls = [];
11975
+ for (let i = 0; i < count; i++) {
11973
11976
  const el = document.createElement("img");
11974
- el.src = img.src;
11975
- el.alt = img.alt;
11977
+ el.src = images[i].src;
11978
+ el.alt = images[i].alt;
11976
11979
  el.loading = "lazy";
11980
+ el.draggable = false;
11981
+ if (i === 0) el.classList.add("nr-hg-active");
11982
+ imgEls.push(el);
11977
11983
  figure.appendChild(el);
11978
11984
  }
11985
+ for (let i = 0; i < count; i++) {
11986
+ const strip = document.createElement("div");
11987
+ strip.className = "nr-hg-trigger";
11988
+ strip.style.left = `${i / count * 100}%`;
11989
+ strip.style.width = `${1 / count * 100}%`;
11990
+ strip.addEventListener("mouseenter", () => {
11991
+ for (let j = 0; j < imgEls.length; j++) {
11992
+ imgEls[j].classList.toggle("nr-hg-active", j === i);
11993
+ }
11994
+ for (let j = 0; j < dotEls.length; j++) {
11995
+ dotEls[j].classList.toggle("nr-hg-dot-active", j === i);
11996
+ }
11997
+ });
11998
+ figure.appendChild(strip);
11999
+ }
12000
+ figure.addEventListener("mouseleave", () => {
12001
+ for (let j = 0; j < imgEls.length; j++) {
12002
+ imgEls[j].classList.toggle("nr-hg-active", j === 0);
12003
+ }
12004
+ for (let j = 0; j < dotEls.length; j++) {
12005
+ dotEls[j].classList.toggle("nr-hg-dot-active", j === 0);
12006
+ }
12007
+ });
12008
+ const dotContainer = document.createElement("div");
12009
+ dotContainer.className = "nr-hg-dots";
12010
+ const dotEls = [];
12011
+ for (let i = 0; i < count; i++) {
12012
+ const dot = document.createElement("span");
12013
+ if (i === 0) dot.classList.add("nr-hg-dot-active");
12014
+ dotEls.push(dot);
12015
+ dotContainer.appendChild(dot);
12016
+ }
12017
+ figure.appendChild(dotContainer);
11979
12018
  return figure;
11980
12019
  };
11981
12020
  var hovergallery_default = hovergalleryDirective;