@xenterprises/nuxt-x-marketing 1.15.4 → 1.15.5

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
@@ -30,6 +30,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
30
30
  section and its sample product data were dropped with them. Every other section of the
31
31
  demo page is unchanged.
32
32
 
33
+ ## [1.15.5] - 2026-10-21
34
+
35
+ ### Added (opt-in)
36
+
37
+ - **`XMarkHero` `reserveIndicatorSpace`** (boolean, kebab `reserve-indicator-space`). With the
38
+ scroll indicator shown, the content column gets room so the CTA ends at least 2rem (32px)
39
+ above the indicator's top. Centred content gets equal top and bottom padding (6.5rem below
40
+ md, 6rem from md), so a hero whose content already fits does not move; content that would not
41
+ fit makes the hero taller (it is a min-height) instead of running into the indicator.
42
+ `verticalAlign="bottom"` and `scrimMobile="bottom"` get the bottom room they lack (8px and
43
+ 64px below md). No effect with `hasScrollIndicator` false. Measured on the Aqualis hero
44
+ (unfinishedwoodfurniture Home): gap 8, 9.5 and -2px at 360x740, 375x667 and 1280x800 became
45
+ 32px (hero 48, 45 and 68px taller); the other six sizes and cheaplawnmower Home are 0 px.
46
+ Unset: body HTML identical to 1.15.4 and 0 px difference at all nine test sizes.
47
+
33
48
  ## [1.15.4] - 2026-10-21
34
49
 
35
50
  ### Fixed
@@ -80,7 +80,10 @@
80
80
  </div>
81
81
 
82
82
  <!-- Content -->
83
- <div class="relative z-10 w-full max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
83
+ <div
84
+ class="relative z-10 w-full max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"
85
+ :class="indicatorClasses"
86
+ >
84
87
  <div
85
88
  class="max-w-3xl pb-6 md:pb-8"
86
89
  :class="[contentAlignmentClasses, { 'x-hero-cts-col': constrain }]"
@@ -277,6 +280,17 @@ const props = defineProps({
277
280
  type: Boolean,
278
281
  default: false,
279
282
  },
283
+ /**
284
+ * Opt-in (1.15.5). With hasScrollIndicator, reserves room so the content (CTA) ends at
285
+ * least 2rem above the scroll indicator. Centred content gets equal top and bottom
286
+ * padding, so a hero whose content already fits keeps its position; content that would
287
+ * not fit makes the hero taller instead of overlapping the indicator. No effect when
288
+ * hasScrollIndicator is false. Unset (default): output identical to 1.15.4.
289
+ */
290
+ reserveIndicatorSpace: {
291
+ type: Boolean,
292
+ default: false,
293
+ },
280
294
  /** Add top padding for non-transparent nav */
281
295
  includeNavPadding: {
282
296
  type: Boolean,
@@ -323,6 +337,16 @@ const constrainStyle = computed(() => {
323
337
  return { "--x-cts-w": w.endsWith("%") ? `${parseFloat(w)}cqw` : w };
324
338
  });
325
339
 
340
+ // reserveIndicatorSpace (1.15.5): only with the scroll indicator shown. The indicator's
341
+ // top sits 6rem above the hero bottom (bottom-8 + 4rem tall); content ends 2rem above it.
342
+ const indicatorClasses = computed(() => {
343
+ if (!props.reserveIndicatorSpace || !props.hasScrollIndicator) return undefined;
344
+ return [
345
+ props.verticalAlign === "bottom" ? "x-hero-ind-b" : "x-hero-ind",
346
+ mobileBottom.value ? "x-hero-ind-mb" : "",
347
+ ];
348
+ });
349
+
326
350
  const heightClass = computed(() => {
327
351
  const heights = {
328
352
  full: "min-h-[calc(100svh-var(--ui-header-height))]",
@@ -423,6 +447,34 @@ const contentAlignmentClasses = computed(() => {
423
447
  --x-cts-pad: 2rem;
424
448
  }
425
449
  }
450
+ /* reserveIndicatorSpace (1.15.5). The scroll indicator's top is 6rem above the hero
451
+ * bottom; the text column ends with pb-6 (md: pb-8). These paddings put the CTA bottom
452
+ * 8rem above the hero bottom, a 2rem gap. Centred: equal top and bottom padding so the
453
+ * content centre does not move; the hero's min-height lets it grow when content does
454
+ * not fit. verticalAlign="bottom" already has pb-24 on the section. */
455
+ .x-hero-ind {
456
+ padding-top: 6.5rem;
457
+ padding-bottom: 6.5rem;
458
+ }
459
+ .x-hero-ind-b {
460
+ padding-bottom: 0.5rem;
461
+ }
462
+ @media (min-width: 768px) {
463
+ .x-hero-ind {
464
+ padding-top: 6rem;
465
+ padding-bottom: 6rem;
466
+ }
467
+ .x-hero-ind-b {
468
+ padding-bottom: 0;
469
+ }
470
+ }
471
+ /* scrimMobile="bottom" below md: the section has pb-10 and bottom-aligned content. */
472
+ @media (max-width: 767.98px) {
473
+ .x-hero-ind-mb {
474
+ padding-top: 0;
475
+ padding-bottom: 4rem;
476
+ }
477
+ }
426
478
  /* md+: 90% up to --x-scrim-w, then a long eased fade to clear. */
427
479
  @media (min-width: 768px) {
428
480
  .x-hero-scrim-w {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@xenterprises/nuxt-x-marketing",
3
3
  "license": "SEE LICENSE IN LICENSE",
4
4
  "type": "module",
5
- "version": "1.15.4",
5
+ "version": "1.15.5",
6
6
  "main": "./nuxt.config.ts",
7
7
  "scripts": {
8
8
  "dev": "nuxi dev .playground",