@asante-org/atlascopco-vt-litesitegenerator 3.8.4 → 3.8.6

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 (33) hide show
  1. package/dist/index.esm.js +517 -58
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/index.esm.scss +276 -2
  4. package/dist/index.js +529 -56
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.scss +276 -2
  7. package/dist/src/components/lsg/LsgBanner/LsgBanner.d.ts +23 -1
  8. package/dist/src/components/lsg/LsgBanner/LsgBanner.stories.d.ts +0 -2
  9. package/dist/src/components/lsg/LsgBanner/index.d.ts +1 -1
  10. package/dist/src/components/lsg/LsgBlogOverview/LsgBlogOverview.d.ts +27 -0
  11. package/dist/src/components/lsg/LsgBlogOverview/LsgBlogOverview.stories.d.ts +11 -0
  12. package/dist/src/components/lsg/LsgBlogOverview/index.d.ts +4 -0
  13. package/dist/src/components/lsg/LsgBlogOverview/mapAemGeneratedListJson.d.ts +40 -0
  14. package/dist/src/components/lsg/LsgGeneratedList/LsgGeneratedList.d.ts +31 -0
  15. package/dist/src/components/lsg/LsgGeneratedList/LsgGeneratedList.stories.d.ts +13 -0
  16. package/dist/src/components/lsg/LsgGeneratedList/index.d.ts +2 -0
  17. package/dist/src/components/lsg/LsgPagination/LsgPagination.d.ts +35 -0
  18. package/dist/src/components/lsg/LsgPagination/LsgPagination.stories.d.ts +13 -0
  19. package/dist/src/components/lsg/LsgPagination/index.d.ts +2 -0
  20. package/dist/src/components/lsg/index.d.ts +7 -1
  21. package/dist/src/index.d.ts +5 -5
  22. package/dist/src/themes/createThemeComponents.d.ts +3 -0
  23. package/dist/src/themes/theme-1/components.d.ts +4 -1
  24. package/dist/src/themes/theme-2/components.d.ts +4 -1
  25. package/dist/src/themes/theme-3/components.d.ts +4 -1
  26. package/dist/themes/theme-1.css +684 -212
  27. package/dist/themes/theme-1.css.map +1 -1
  28. package/dist/themes/theme-2.css +1032 -12
  29. package/dist/themes/theme-2.css.map +1 -1
  30. package/dist/themes/theme-3.css +842 -36
  31. package/dist/themes/theme-3.css.map +1 -1
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +1 -1
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect, useId, useCallback, useMemo, forwardRef, useImperativeHandle } from 'react';
1
+ import React, { useId, useState, useRef, useEffect, useCallback, useMemo, forwardRef, useImperativeHandle } from 'react';
2
2
 
3
3
  function _extends() {
4
4
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
@@ -46,12 +46,87 @@ var LsgButton = function (_a) {
46
46
  }, children);
47
47
  };
48
48
 
49
- function bannerClassName(layout, mobileMediaPosition, background, className) {
50
- return ["lsg-banner", "lsg-banner--".concat(layout), "lsg-banner--mobile-media-".concat(mobileMediaPosition),
51
- // In AEM this class arrives on the decoration div instead; the SCSS only
52
- // sets inherited custom properties, so either position works.
53
- background ? "lsg-banner--bg-".concat(background) : "", className].filter(Boolean).join(" ");
49
+ // ─────────────────────────────────────────────────────────────────────────────
50
+ // AEM markup helpers
51
+ //
52
+ // The banner's content region is a parsys in AEM, filled by _cq_template with
53
+ // Group > Title / Text / Button components. These helpers reproduce the HTML
54
+ // those components (and their Sling decoration divs) emit on publish, so the
55
+ // theme CSS written here applies to AEM unchanged. Reference page:
56
+ // /content/vtba/varovac/en (wcmmode=disabled).
57
+ // ─────────────────────────────────────────────────────────────────────────────
58
+ var GRID_COLUMN = "aem-GridColumn aem-GridColumn--default--12";
59
+ /** vtba/components/lsg/structure/group — a responsivegrid with two wrappers. */
60
+ var AemGroup = function (_a) {
61
+ var styleClasses = _a.styleClasses,
62
+ children = _a.children;
63
+ return /*#__PURE__*/React.createElement("div", {
64
+ className: ["lsg-group", styleClasses].filter(Boolean).join(" ")
65
+ }, /*#__PURE__*/React.createElement("div", {
66
+ className: "layout-container-color-wrapper"
67
+ }, /*#__PURE__*/React.createElement("div", {
68
+ className: "layout-container-spacing-wrapper aem-Grid aem-Grid--12 aem-Grid--default--12 "
69
+ }, children)));
70
+ };
71
+ /**
72
+ * AEM decoration class for a grid column: the component's own class, then either
73
+ * its authored style classes or — when none are set — the component name.
74
+ */
75
+ function columnClassName(componentClass, name, styleClass) {
76
+ return "".concat(componentClass, " ").concat(styleClass !== null && styleClass !== void 0 ? styleClass : name, " ").concat(GRID_COLUMN);
54
77
  }
78
+ /** vtba/components/lsg/content/title — type "p" is the pre-title. */
79
+ var AemTitle = function (_a) {
80
+ var Tag = _a.tag,
81
+ colour = _a.colour,
82
+ children = _a.children;
83
+ return /*#__PURE__*/React.createElement("div", {
84
+ className: columnClassName("cmp-lsg-title", "title", colour && "cmp-title__colour-".concat(colour))
85
+ }, /*#__PURE__*/React.createElement(Tag, {
86
+ className: "cmp-title__element".concat(Tag === "p" ? " cmp-title__element--pretitle" : "")
87
+ }, children));
88
+ };
89
+ /** vtba/components/lsg/content/text — core text v2 inside the decoration div. */
90
+ var AemText = function (_a) {
91
+ var id = _a.id,
92
+ colour = _a.colour,
93
+ children = _a.children;
94
+ return /*#__PURE__*/React.createElement("div", {
95
+ className: columnClassName("cmp-lsg-text", "text", colour && "cmp-text__colour-".concat(colour))
96
+ }, /*#__PURE__*/React.createElement("div", {
97
+ id: id,
98
+ className: "cmp-text"
99
+ }, /*#__PURE__*/React.createElement("p", null, children)));
100
+ };
101
+ /** vtba/components/lsg/content/button — the variant is a style class on the decoration div. */
102
+ var AemButton = function (_a) {
103
+ var _b, _c;
104
+ var cta = _a.cta;
105
+ return /*#__PURE__*/React.createElement("div", {
106
+ className: "cmp-lsg-button button--".concat((_b = cta.variant) !== null && _b !== void 0 ? _b : "primary", " ").concat(GRID_COLUMN)
107
+ }, /*#__PURE__*/React.createElement("div", {
108
+ className: "lsg-button-container"
109
+ }, /*#__PURE__*/React.createElement("a", {
110
+ className: "lsg-button",
111
+ href: (_c = cta.href) !== null && _c !== void 0 ? _c : "#",
112
+ target: cta.external ? "_blank" : undefined,
113
+ rel: cta.external ? "noopener noreferrer" : undefined,
114
+ onClick: cta.onClick
115
+ }, /*#__PURE__*/React.createElement("span", {
116
+ className: "lsg-button__text"
117
+ }, cta.label))));
118
+ };
119
+ /** Same extension mapping as BannerModel.getVideoMimeType. */
120
+ function videoMimeType(url) {
121
+ var path = url.split(/[?#]/)[0].toLowerCase();
122
+ if (path.endsWith(".mp4")) return "video/mp4";
123
+ if (path.endsWith(".webm")) return "video/webm";
124
+ if (path.endsWith(".ogg") || path.endsWith(".ogv")) return "video/ogg";
125
+ return undefined;
126
+ }
127
+ // ─────────────────────────────────────────────────────────────────────────────
128
+ // LsgBanner
129
+ // ─────────────────────────────────────────────────────────────────────────────
55
130
  var LsgBanner = function (_a) {
56
131
  var heading = _a.heading,
57
132
  preTitle = _a.preTitle,
@@ -60,10 +135,15 @@ var LsgBanner = function (_a) {
60
135
  copy = _a.copy,
61
136
  ctas = _a.ctas,
62
137
  cta = _a.cta,
138
+ preTitleColour = _a.preTitleColour,
139
+ headingColour = _a.headingColour,
140
+ bodyColour = _a.bodyColour,
63
141
  mediaType = _a.mediaType,
64
142
  imageUrl = _a.imageUrl,
65
143
  _b = _a.imageAlt,
66
144
  imageAlt = _b === void 0 ? "" : _b,
145
+ mediaHref = _a.mediaHref,
146
+ mediaTarget = _a.mediaTarget,
67
147
  videoUrl = _a.videoUrl,
68
148
  videoPoster = _a.videoPoster,
69
149
  _c = _a.videoControls,
@@ -79,65 +159,78 @@ var LsgBanner = function (_a) {
79
159
  _h = _a.mobileMediaPosition,
80
160
  mobileMediaPosition = _h === void 0 ? "top" : _h,
81
161
  background = _a.background,
162
+ accent = _a.accent,
82
163
  _j = _a.headingTag,
83
- headingTag = _j === void 0 ? "h1" : _j,
164
+ headingTag = _j === void 0 ? "h2" : _j,
84
165
  className = _a.className;
166
+ var textId = "text-".concat(useId().replace(/[^a-zA-Z0-9]/g, ""));
85
167
  var resolvedPreTitle = preTitle !== null && preTitle !== void 0 ? preTitle : eyebrow;
86
168
  var resolvedBody = body !== null && body !== void 0 ? body : copy;
87
169
  var actions = ((ctas === null || ctas === void 0 ? void 0 : ctas.length) ? ctas : cta ? [cta] : []).slice(0, 3);
88
170
  var resolvedMediaType = mediaType !== null && mediaType !== void 0 ? mediaType : videoUrl ? "video" : "image";
89
171
  var hasMedia = layout !== "text-only" && (resolvedMediaType === "video" ? Boolean(videoUrl) : Boolean(imageUrl));
90
- var HeadingTag = headingTag;
91
- return /*#__PURE__*/React.createElement("section", {
92
- className: bannerClassName(layout, mobileMediaPosition, background, className),
93
- "data-lsg-is": "banner",
94
- "data-lsg-banner-layout": layout,
95
- "data-lsg-banner-mobile-media": mobileMediaPosition,
96
- "data-lsg-banner-media": hasMedia ? resolvedMediaType : "none"
97
- }, /*#__PURE__*/React.createElement("div", {
98
- className: "lsg-banner__shell"
99
- }, hasMedia && /*#__PURE__*/React.createElement("div", {
100
- className: "lsg-banner__media"
101
- }, resolvedMediaType === "video" && videoUrl ? /*#__PURE__*/React.createElement("video", {
102
- className: "lsg-banner__video",
103
- src: videoUrl,
104
- poster: videoPoster,
105
- controls: videoControls,
106
- autoPlay: videoAutoPlay,
107
- muted: videoMuted,
108
- loop: videoLoop,
109
- playsInline: true,
110
- "aria-label": imageAlt || heading
111
- }) : imageUrl ? /*#__PURE__*/React.createElement("img", {
112
- className: "lsg-banner__image",
172
+ var picture = /*#__PURE__*/React.createElement("picture", {
173
+ className: "lsg-banner__image"
174
+ }, /*#__PURE__*/React.createElement("img", {
113
175
  src: imageUrl,
114
- alt: imageAlt
115
- }) : null), /*#__PURE__*/React.createElement("div", {
116
- className: "lsg-banner__content"
117
- }, resolvedPreTitle && /*#__PURE__*/React.createElement("div", {
118
- className: "lsg-banner__pre-title"
119
- }, /*#__PURE__*/React.createElement("span", {
120
- className: "lsg-banner__pre-title-marker",
121
- "aria-hidden": "true"
122
- }), /*#__PURE__*/React.createElement("span", {
123
- className: "lsg-banner__pre-title-text"
124
- }, resolvedPreTitle)), /*#__PURE__*/React.createElement(HeadingTag, {
125
- className: "lsg-banner__heading"
126
- }, heading), resolvedBody && /*#__PURE__*/React.createElement("div", {
127
- className: "lsg-banner__body"
128
- }, /*#__PURE__*/React.createElement("p", null, resolvedBody)), actions.length > 0 && /*#__PURE__*/React.createElement("div", {
129
- className: "lsg-banner__actions"
130
- }, actions.map(function (action, index) {
131
- var _a, _b;
132
- return /*#__PURE__*/React.createElement(LsgButton, {
133
- key: "".concat(action.label, "-").concat((_a = action.href) !== null && _a !== void 0 ? _a : "button", "-").concat(index),
134
- href: action.href,
135
- external: action.external,
136
- variant: (_b = action.variant) !== null && _b !== void 0 ? _b : "primary",
137
- onClick: action.onClick,
138
- className: "lsg-banner__cta"
139
- }, action.label);
140
- })))));
176
+ alt: imageAlt,
177
+ loading: "lazy"
178
+ }));
179
+ return (
180
+ /*#__PURE__*/
181
+ // The Sling decoration div. Background / accent style-system classes land
182
+ // here in AEM, not on the section.
183
+ React.createElement("div", {
184
+ className: ["banner teaser", background && "lsg-banner--bg-".concat(background), accent && "lsg-banner--accent-".concat(accent), GRID_COLUMN, className].filter(Boolean).join(" ")
185
+ }, /*#__PURE__*/React.createElement("section", {
186
+ className: "lsg-banner lsg-banner--".concat(layout, " lsg-banner--mobile-media-").concat(mobileMediaPosition),
187
+ "data-lsg-is": "banner",
188
+ "data-lsg-banner-layout": layout,
189
+ "data-lsg-banner-mobile-media": mobileMediaPosition,
190
+ "data-lsg-banner-media": hasMedia ? resolvedMediaType : "none"
191
+ }, /*#__PURE__*/React.createElement("div", {
192
+ className: "lsg-banner__shell"
193
+ }, hasMedia && /*#__PURE__*/React.createElement("div", {
194
+ className: "lsg-banner__media"
195
+ }, resolvedMediaType === "video" && videoUrl ? /*#__PURE__*/React.createElement("video", {
196
+ className: "lsg-banner__video",
197
+ poster: videoPoster,
198
+ autoPlay: videoAutoPlay,
199
+ muted: videoMuted,
200
+ loop: videoLoop,
201
+ controls: videoControls,
202
+ playsInline: true,
203
+ "aria-label": imageAlt
204
+ }, /*#__PURE__*/React.createElement("source", {
205
+ src: videoUrl,
206
+ type: videoMimeType(videoUrl)
207
+ })) : mediaHref ? /*#__PURE__*/React.createElement("a", {
208
+ className: "lsg-banner__media-link",
209
+ href: mediaHref,
210
+ target: mediaTarget
211
+ }, picture) : picture), /*#__PURE__*/React.createElement("div", {
212
+ className: "lsg-banner__content"
213
+ }, /*#__PURE__*/React.createElement(AemGroup, {
214
+ styleClasses: "lsg-group-display--flex lsg-group-direction--column lsg-group-gap--16"
215
+ }, resolvedPreTitle && /*#__PURE__*/React.createElement(AemTitle, {
216
+ tag: "p",
217
+ colour: preTitleColour
218
+ }, resolvedPreTitle), /*#__PURE__*/React.createElement(AemTitle, {
219
+ tag: headingTag,
220
+ colour: headingColour
221
+ }, heading)), resolvedBody && /*#__PURE__*/React.createElement(AemGroup, null, /*#__PURE__*/React.createElement(AemText, {
222
+ id: textId,
223
+ colour: bodyColour
224
+ }, resolvedBody)), actions.length > 0 && /*#__PURE__*/React.createElement(AemGroup, {
225
+ styleClasses: "lsg-group-display--flex lsg-group-gap--16"
226
+ }, actions.map(function (action, index) {
227
+ var _a;
228
+ return /*#__PURE__*/React.createElement(AemButton, {
229
+ key: "".concat(action.label, "-").concat((_a = action.href) !== null && _a !== void 0 ? _a : "button", "-").concat(index),
230
+ cta: action
231
+ });
232
+ }))))))
233
+ );
141
234
  };
142
235
 
143
236
  function isSafeUrl$1(url) {
@@ -2476,6 +2569,357 @@ var LsgCards = function (_a) {
2476
2569
  }));
2477
2570
  };
2478
2571
 
2572
+ /**
2573
+ * Mirrors AEM `vtba/components/content/generated-list` in "LSG Card" mode,
2574
+ * including its `cq:htmlTag` wrapper. Card styling comes from LsgCard.
2575
+ */
2576
+ var LsgGeneratedList = function (_a) {
2577
+ var items = _a.items,
2578
+ _b = _a.cardVariant,
2579
+ cardVariant = _b === void 0 ? "withImage" : _b,
2580
+ _c = _a.maxColumns,
2581
+ maxColumns = _c === void 0 ? 3 : _c,
2582
+ className = _a.className;
2583
+ var wrapperClassName = ["c-row--divider", "generated-list", className].filter(Boolean).join(" ");
2584
+ return /*#__PURE__*/React.createElement("div", {
2585
+ className: wrapperClassName
2586
+ }, /*#__PURE__*/React.createElement("div", {
2587
+ className: "generated-list-container"
2588
+ }, /*#__PURE__*/React.createElement("ul", {
2589
+ className: "generated-list-container__ul lsg-cards lsg-cards--cols-".concat(maxColumns),
2590
+ "data-total-items": items.length,
2591
+ "data-item-per-row": maxColumns,
2592
+ "data-columns": maxColumns
2593
+ }, items.map(function (item, index) {
2594
+ var _a;
2595
+ return /*#__PURE__*/React.createElement("li", {
2596
+ className: "lsg-cards__item",
2597
+ key: "".concat(item.href, "-").concat(index)
2598
+ }, /*#__PURE__*/React.createElement(LsgCard, _extends({}, item, {
2599
+ imageAlt: (_a = item.imageAlt) !== null && _a !== void 0 ? _a : item.title,
2600
+ variant: cardVariant
2601
+ })));
2602
+ }))));
2603
+ };
2604
+
2605
+ /******************************************************************************
2606
+ Copyright (c) Microsoft Corporation.
2607
+
2608
+ Permission to use, copy, modify, and/or distribute this software for any
2609
+ purpose with or without fee is hereby granted.
2610
+
2611
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
2612
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
2613
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
2614
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
2615
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
2616
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2617
+ PERFORMANCE OF THIS SOFTWARE.
2618
+ ***************************************************************************** */
2619
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
2620
+
2621
+ var __assign = function () {
2622
+ __assign = Object.assign || function __assign(t) {
2623
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
2624
+ s = arguments[i];
2625
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
2626
+ }
2627
+ return t;
2628
+ };
2629
+ return __assign.apply(this, arguments);
2630
+ };
2631
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
2632
+ var e = new Error(message);
2633
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
2634
+ };
2635
+
2636
+ var DEFAULT_LABELS = {
2637
+ nav: "Pagination",
2638
+ first: "First",
2639
+ previous: "Previous",
2640
+ next: "Next",
2641
+ last: "Last",
2642
+ page: function (page) {
2643
+ return "Page ".concat(page);
2644
+ }
2645
+ };
2646
+ /**
2647
+ * Page numbers to show: always the first and last page plus the current page
2648
+ * ± `siblingCount`. A gap of a single page shows that page rather than "…".
2649
+ * Page 2 of 6 → [1, 2, 3, "ellipsis", 6].
2650
+ */
2651
+ function getLsgPaginationRange(currentPage, totalPages, siblingCount) {
2652
+ if (siblingCount === void 0) {
2653
+ siblingCount = 1;
2654
+ }
2655
+ if (totalPages < 1) {
2656
+ return [];
2657
+ }
2658
+ var current = Math.min(Math.max(currentPage, 1), totalPages);
2659
+ var pages = new Set([1, totalPages]);
2660
+ for (var page = current - siblingCount; page <= current + siblingCount; page += 1) {
2661
+ if (page >= 1 && page <= totalPages) {
2662
+ pages.add(page);
2663
+ }
2664
+ }
2665
+ var sorted = Array.from(pages).sort(function (a, b) {
2666
+ return a - b;
2667
+ });
2668
+ var range = [];
2669
+ sorted.forEach(function (page, index) {
2670
+ var previous = sorted[index - 1];
2671
+ if (previous !== undefined) {
2672
+ if (page - previous === 2) {
2673
+ range.push(previous + 1);
2674
+ } else if (page - previous > 2) {
2675
+ range.push("ellipsis");
2676
+ }
2677
+ }
2678
+ range.push(page);
2679
+ });
2680
+ return range;
2681
+ }
2682
+ // Left-pointing glyphs on a 24×24 grid; next/last mirror them. Each control
2683
+ // carries every glyph its themes need and theme CSS shows one: theme 1 uses
2684
+ // the chevrons (‹ «), theme 2 the bar (|<), theme 3 the arrow (←).
2685
+ var GLYPHS = {
2686
+ previous: {
2687
+ chevron: "M14.5 6.5 9 12l5.5 5.5",
2688
+ arrow: "M19 12H5M11 6l-6 6 6 6"
2689
+ },
2690
+ first: {
2691
+ "chevron-double": "M12 6.5 6.5 12l5.5 5.5M18 6.5 12.5 12l5.5 5.5",
2692
+ bar: "M7 6.5v11M16.5 6.5 11 12l5.5 5.5"
2693
+ }
2694
+ };
2695
+ var PaginationIcon = function (_a) {
2696
+ var kind = _a.kind;
2697
+ var glyphs = GLYPHS[kind === "first" || kind === "last" ? "first" : "previous"];
2698
+ var mirrored = kind === "next" || kind === "last";
2699
+ return /*#__PURE__*/React.createElement("svg", {
2700
+ className: "lsg-pagination__icon",
2701
+ xmlns: "http://www.w3.org/2000/svg",
2702
+ viewBox: "0 0 24 24",
2703
+ "aria-hidden": "true",
2704
+ focusable: "false"
2705
+ }, /*#__PURE__*/React.createElement("g", {
2706
+ transform: mirrored ? "matrix(-1 0 0 1 24 0)" : undefined
2707
+ }, Object.entries(glyphs).map(function (_a) {
2708
+ var name = _a[0],
2709
+ d = _a[1];
2710
+ return /*#__PURE__*/React.createElement("path", {
2711
+ key: name,
2712
+ className: "lsg-pagination__glyph lsg-pagination__glyph--".concat(name),
2713
+ d: d
2714
+ });
2715
+ })));
2716
+ };
2717
+ var LsgPagination = function (_a) {
2718
+ var currentPage = _a.currentPage,
2719
+ totalPages = _a.totalPages,
2720
+ onPageChange = _a.onPageChange,
2721
+ _b = _a.siblingCount,
2722
+ siblingCount = _b === void 0 ? 1 : _b,
2723
+ _c = _a.truncate,
2724
+ truncate = _c === void 0 ? true : _c,
2725
+ _d = _a.showFirstLast,
2726
+ showFirstLast = _d === void 0 ? false : _d,
2727
+ labels = _a.labels,
2728
+ className = _a.className;
2729
+ if (totalPages <= 1) {
2730
+ return null;
2731
+ }
2732
+ var text = __assign(__assign({}, DEFAULT_LABELS), labels);
2733
+ var current = Math.min(Math.max(currentPage, 1), totalPages);
2734
+ var goTo = function (page) {
2735
+ if (page !== current && page >= 1 && page <= totalPages) {
2736
+ onPageChange(page);
2737
+ }
2738
+ };
2739
+ var control = function (kind, target, disabled) {
2740
+ var label = /*#__PURE__*/React.createElement("span", {
2741
+ className: "lsg-pagination__label"
2742
+ }, text[kind]);
2743
+ var iconFirst = kind === "first" || kind === "previous";
2744
+ return /*#__PURE__*/React.createElement("li", {
2745
+ className: "lsg-pagination__item lsg-pagination__item--".concat(kind)
2746
+ }, /*#__PURE__*/React.createElement("button", {
2747
+ type: "button",
2748
+ className: "lsg-pagination__control lsg-pagination__control--".concat(kind),
2749
+ disabled: disabled,
2750
+ onClick: function () {
2751
+ return goTo(target);
2752
+ }
2753
+ }, iconFirst && /*#__PURE__*/React.createElement(PaginationIcon, {
2754
+ kind: kind
2755
+ }), label, !iconFirst && /*#__PURE__*/React.createElement(PaginationIcon, {
2756
+ kind: kind
2757
+ })));
2758
+ };
2759
+ return /*#__PURE__*/React.createElement("nav", {
2760
+ className: ["lsg-pagination", className].filter(Boolean).join(" "),
2761
+ "aria-label": text.nav
2762
+ }, /*#__PURE__*/React.createElement("ul", {
2763
+ className: "lsg-pagination__list"
2764
+ }, showFirstLast && control("first", 1, current === 1), control("previous", current - 1, current === 1), (truncate ? getLsgPaginationRange(current, totalPages, siblingCount) : Array.from({
2765
+ length: totalPages
2766
+ }, function (_, index) {
2767
+ return index + 1;
2768
+ })).map(function (item, index) {
2769
+ return item === "ellipsis" ? /*#__PURE__*/React.createElement("li", {
2770
+ key: "ellipsis-".concat(index),
2771
+ className: "lsg-pagination__item lsg-pagination__ellipsis",
2772
+ "aria-hidden": "true"
2773
+ }, "\u2026") : /*#__PURE__*/React.createElement("li", {
2774
+ key: item,
2775
+ className: "lsg-pagination__item"
2776
+ }, /*#__PURE__*/React.createElement("button", {
2777
+ type: "button",
2778
+ className: "lsg-pagination__page",
2779
+ "aria-label": text.page(item),
2780
+ "aria-current": item === current ? "page" : undefined,
2781
+ onClick: function () {
2782
+ return goTo(item);
2783
+ }
2784
+ }, /*#__PURE__*/React.createElement("span", {
2785
+ className: "lsg-pagination__page-text",
2786
+ "data-text": item
2787
+ }, item)));
2788
+ }), control("next", current + 1, current === totalPages), showFirstLast && control("last", totalPages, current === totalPages)));
2789
+ };
2790
+
2791
+ var defaultStatusLabel = function (page, totalPages) {
2792
+ return "Page ".concat(page, " of ").concat(totalPages);
2793
+ };
2794
+ /**
2795
+ * Client-side, paginated card list for the AEM Generated List when "Enable
2796
+ * client-side React rendering" is on. ac-react-app mounts it into the
2797
+ * component's placeholder; see mapAemGeneratedListJson for the data.
2798
+ */
2799
+ var LsgBlogOverview = function (_a) {
2800
+ var items = _a.items,
2801
+ _b = _a.cardVariant,
2802
+ cardVariant = _b === void 0 ? "withImage" : _b,
2803
+ _c = _a.maxColumns,
2804
+ maxColumns = _c === void 0 ? 3 : _c,
2805
+ _d = _a.rows,
2806
+ rows = _d === void 0 ? 3 : _d,
2807
+ paginationLabels = _a.paginationLabels,
2808
+ _e = _a.showFirstLast,
2809
+ showFirstLast = _e === void 0 ? false : _e,
2810
+ _f = _a.truncatePages,
2811
+ truncatePages = _f === void 0 ? true : _f,
2812
+ _g = _a.statusLabel,
2813
+ statusLabel = _g === void 0 ? defaultStatusLabel : _g,
2814
+ className = _a.className;
2815
+ var rootRef = useRef(null);
2816
+ var _h = useState(1),
2817
+ page = _h[0],
2818
+ setPage = _h[1];
2819
+ var _j = useState(""),
2820
+ status = _j[0],
2821
+ setStatus = _j[1];
2822
+ var pageSize = Math.max(1, maxColumns * Math.max(1, rows));
2823
+ var totalPages = Math.max(1, Math.ceil(items.length / pageSize));
2824
+ // Clamped on read, so a shorter item list never strands the user on an empty page.
2825
+ var currentPage = Math.min(page, totalPages);
2826
+ var pageItems = items.slice((currentPage - 1) * pageSize, currentPage * pageSize);
2827
+ var handlePageChange = function (nextPage) {
2828
+ var _a;
2829
+ setPage(nextPage);
2830
+ setStatus(statusLabel(nextPage, totalPages));
2831
+ // Bring the list back into view when its top has scrolled off the screen.
2832
+ var root = rootRef.current;
2833
+ if (root && root.getBoundingClientRect().top < 0) {
2834
+ var reduceMotion = (_a = window.matchMedia) === null || _a === void 0 ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches;
2835
+ root.scrollIntoView({
2836
+ behavior: reduceMotion ? "auto" : "smooth",
2837
+ block: "start"
2838
+ });
2839
+ }
2840
+ };
2841
+ return /*#__PURE__*/React.createElement("div", {
2842
+ ref: rootRef,
2843
+ className: ["lsg-blog-overview", className].filter(Boolean).join(" ")
2844
+ }, /*#__PURE__*/React.createElement(LsgCards, {
2845
+ columns: maxColumns,
2846
+ cards: pageItems.map(function (item) {
2847
+ var _a;
2848
+ return __assign(__assign({}, item), {
2849
+ imageAlt: (_a = item.imageAlt) !== null && _a !== void 0 ? _a : item.title,
2850
+ variant: cardVariant
2851
+ });
2852
+ })
2853
+ }), /*#__PURE__*/React.createElement(LsgPagination, {
2854
+ currentPage: currentPage,
2855
+ totalPages: totalPages,
2856
+ onPageChange: handlePageChange,
2857
+ labels: paginationLabels,
2858
+ showFirstLast: showFirstLast,
2859
+ truncate: truncatePages
2860
+ }), /*#__PURE__*/React.createElement("p", {
2861
+ className: "lsg-visually-hidden",
2862
+ "aria-live": "polite"
2863
+ }, status));
2864
+ };
2865
+
2866
+ var CARD_VARIANTS = ["withImage", "onlyText", "withIcon"];
2867
+ var isRecord = function (value) {
2868
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2869
+ };
2870
+ /** Trimmed string, or undefined for anything empty or not a string. */
2871
+ var text = function (value) {
2872
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
2873
+ };
2874
+ function toColumns(value) {
2875
+ var columns = Number.parseInt(String(value), 10);
2876
+ return columns >= 2 && columns <= 5 ? columns : 3;
2877
+ }
2878
+ function toCardVariant(value) {
2879
+ var _a;
2880
+ return (_a = CARD_VARIANTS.find(function (variant) {
2881
+ return variant === value;
2882
+ })) !== null && _a !== void 0 ? _a : "withImage";
2883
+ }
2884
+ function toItem(raw) {
2885
+ var _a;
2886
+ if (!isRecord(raw)) {
2887
+ return null;
2888
+ }
2889
+ var path = text(raw.path);
2890
+ var title = (_a = text(raw.referenceTitle)) !== null && _a !== void 0 ? _a : text(raw["jcr:title"]);
2891
+ if (!path || !title) {
2892
+ return null;
2893
+ }
2894
+ var image = text(raw.referenceImage);
2895
+ return {
2896
+ // The HTL adds the extension with `@ extension='html'`; the JSON doesn't.
2897
+ href: path.endsWith(".html") ? path : "".concat(path, ".html"),
2898
+ title: title,
2899
+ preTitle: text(raw.referencePreTitle),
2900
+ subtitle: text(raw.referenceSubtitle),
2901
+ description: text(raw.referenceText),
2902
+ // DAM file names can contain spaces.
2903
+ imageUrl: image ? encodeURI(image) : undefined
2904
+ };
2905
+ }
2906
+ /**
2907
+ * Maps the AEM Generated List JSON to LsgBlogOverview props. Tolerates missing
2908
+ * or malformed fields and never throws on the shape; items without a path or
2909
+ * title are dropped.
2910
+ */
2911
+ function mapAemGeneratedListJson(json) {
2912
+ var data = isRecord(json) ? json : {};
2913
+ var items = Array.isArray(data.items) ? data.items.map(toItem).filter(function (item) {
2914
+ return item !== null;
2915
+ }) : [];
2916
+ return {
2917
+ items: items,
2918
+ cardVariant: toCardVariant(data.cardVariant),
2919
+ maxColumns: toColumns(data.maxColumns)
2920
+ };
2921
+ }
2922
+
2479
2923
  var LSG_ICON_PATHS = {
2480
2924
  bars: "M96 160C96 142.3 110.3 128 128 128L512 128C529.7 128 544 142.3 544 160C544 177.7 529.7 192 512 192L128 192C110.3 192 96 177.7 96 160zM96 320C96 302.3 110.3 288 128 288L512 288C529.7 288 544 302.3 544 320C544 337.7 529.7 352 512 352L128 352C110.3 352 96 337.7 96 320zM544 480C544 497.7 529.7 512 512 512L128 512C110.3 512 96 497.7 96 480C96 462.3 110.3 448 128 448L512 448C529.7 448 544 462.3 544 480z",
2481
2925
  chevronLeft: "M169.4 297.4C156.9 309.9 156.9 330.2 169.4 342.7L361.4 534.7C373.9 547.2 394.2 547.2 406.7 534.7C419.2 522.2 419.2 501.9 406.7 489.4L237.3 320L406.6 150.6C419.1 138.1 419.1 117.8 406.6 105.3C394.1 92.8 373.8 92.8 361.3 105.3L169.3 297.3z",
@@ -5318,6 +5762,9 @@ var BASE_COMPONENTS = {
5318
5762
  LsgCarousel: LsgCarousel,
5319
5763
  LsgCard: LsgCard,
5320
5764
  LsgCards: LsgCards,
5765
+ LsgGeneratedList: LsgGeneratedList,
5766
+ LsgPagination: LsgPagination,
5767
+ LsgBlogOverview: LsgBlogOverview,
5321
5768
  LsgBreadcrumb: LsgBreadcrumb,
5322
5769
  LsgLogo: LsgLogo,
5323
5770
  LsgNavigation: LsgNavigation,
@@ -5358,6 +5805,9 @@ function createThemeComponents(themeName) {
5358
5805
  LsgCarousel: createThemeComponent(themeName, "carousel", BASE_COMPONENTS.LsgCarousel),
5359
5806
  LsgCard: createThemeComponent(themeName, "card", BASE_COMPONENTS.LsgCard),
5360
5807
  LsgCards: createThemeComponent(themeName, "cards", BASE_COMPONENTS.LsgCards),
5808
+ LsgGeneratedList: createThemeComponent(themeName, "generated-list", BASE_COMPONENTS.LsgGeneratedList),
5809
+ LsgPagination: createThemeComponent(themeName, "pagination", BASE_COMPONENTS.LsgPagination),
5810
+ LsgBlogOverview: createThemeComponent(themeName, "blog-overview", BASE_COMPONENTS.LsgBlogOverview),
5361
5811
  LsgBreadcrumb: createThemeComponent(themeName, "breadcrumb", BASE_COMPONENTS.LsgBreadcrumb),
5362
5812
  LsgLogo: createThemeComponent(themeName, "logo", BASE_COMPONENTS.LsgLogo),
5363
5813
  LsgNavigation: createThemeComponent(themeName, "navigation", BASE_COMPONENTS.LsgNavigation),
@@ -5390,6 +5840,9 @@ var Theme1LsgButton = theme1Components.LsgButton,
5390
5840
  Theme1LsgCarousel = theme1Components.LsgCarousel,
5391
5841
  Theme1LsgCard = theme1Components.LsgCard,
5392
5842
  Theme1LsgCards = theme1Components.LsgCards,
5843
+ Theme1LsgGeneratedList = theme1Components.LsgGeneratedList,
5844
+ Theme1LsgPagination = theme1Components.LsgPagination,
5845
+ Theme1LsgBlogOverview = theme1Components.LsgBlogOverview,
5393
5846
  Theme1LsgBreadcrumb = theme1Components.LsgBreadcrumb,
5394
5847
  Theme1LsgLogo = theme1Components.LsgLogo,
5395
5848
  Theme1LsgNavigation = theme1Components.LsgNavigation,
@@ -5421,6 +5874,9 @@ var Theme2LsgButton = theme2Components.LsgButton,
5421
5874
  Theme2LsgCarousel = theme2Components.LsgCarousel,
5422
5875
  Theme2LsgCard = theme2Components.LsgCard,
5423
5876
  Theme2LsgCards = theme2Components.LsgCards,
5877
+ Theme2LsgGeneratedList = theme2Components.LsgGeneratedList,
5878
+ Theme2LsgPagination = theme2Components.LsgPagination,
5879
+ Theme2LsgBlogOverview = theme2Components.LsgBlogOverview,
5424
5880
  Theme2LsgBreadcrumb = theme2Components.LsgBreadcrumb,
5425
5881
  Theme2LsgLogo = theme2Components.LsgLogo,
5426
5882
  Theme2LsgNavigation = theme2Components.LsgNavigation,
@@ -5450,6 +5906,9 @@ var Theme3LsgButton = theme3Components.LsgButton,
5450
5906
  Theme3LsgCarousel = theme3Components.LsgCarousel,
5451
5907
  Theme3LsgCard = theme3Components.LsgCard,
5452
5908
  Theme3LsgCards = theme3Components.LsgCards,
5909
+ Theme3LsgGeneratedList = theme3Components.LsgGeneratedList,
5910
+ Theme3LsgPagination = theme3Components.LsgPagination,
5911
+ Theme3LsgBlogOverview = theme3Components.LsgBlogOverview,
5453
5912
  Theme3LsgBreadcrumb = theme3Components.LsgBreadcrumb,
5454
5913
  Theme3LsgLogo = theme3Components.LsgLogo,
5455
5914
  Theme3LsgNavigation = theme3Components.LsgNavigation,
@@ -5473,5 +5932,5 @@ var Theme3LsgButton = theme3Components.LsgButton,
5473
5932
  theme3Components.LsgFormFieldConsent;
5474
5933
  theme3Components.LsgFormStep;
5475
5934
 
5476
- export { LsgBanner, LsgBreadcrumb, LsgButton, LsgCard, LsgCards, LsgCarousel, LsgCarouselController, LsgFooter, LsgHeader, LsgHero, LsgHeroCard, LsgHeroController, LsgLanguageSwitcher, LsgLogo, LsgNavigation, LsgQuickLinks, LsgSearchOverlay, LsgSearchTrigger, LsgSocialMediaIcons, LsgTable, Theme1LsgBanner, Theme1LsgBreadcrumb, Theme1LsgButton, Theme1LsgCard, Theme1LsgCards, Theme1LsgCarousel, Theme1LsgFooter, Theme1LsgHeader, Theme1LsgHero, Theme1LsgLanguageSwitcher, Theme1LsgLogo, Theme1LsgNavigation, Theme1LsgQuickLinks, Theme1LsgSearchOverlay, Theme1LsgSearchTrigger, Theme1LsgSocialMediaIcons, Theme1LsgTable, Theme2LsgBanner, Theme2LsgBreadcrumb, Theme2LsgButton, Theme2LsgCard, Theme2LsgCards, Theme2LsgCarousel, Theme2LsgFooter, Theme2LsgHeader, Theme2LsgHero, Theme2LsgLanguageSwitcher, Theme2LsgLogo, Theme2LsgNavigation, Theme2LsgQuickLinks, Theme2LsgSearchOverlay, Theme2LsgSearchTrigger, Theme2LsgSocialMediaIcons, Theme2LsgTable, Theme3LsgBanner, Theme3LsgBreadcrumb, Theme3LsgButton, Theme3LsgCard, Theme3LsgCards, Theme3LsgCarousel, Theme3LsgFooter, Theme3LsgHeader, Theme3LsgHero, Theme3LsgLanguageSwitcher, Theme3LsgLogo, Theme3LsgNavigation, Theme3LsgQuickLinks, Theme3LsgSearchOverlay, Theme3LsgSearchTrigger, Theme3LsgSocialMediaIcons, Theme3LsgTable, getTelValue, initTelPickers, theme1Components, theme2Components, theme3Components };
5935
+ export { LsgBanner, LsgBlogOverview, LsgBreadcrumb, LsgButton, LsgCard, LsgCards, LsgCarousel, LsgCarouselController, LsgFooter, LsgGeneratedList, LsgHeader, LsgHero, LsgHeroCard, LsgHeroController, LsgLanguageSwitcher, LsgLogo, LsgNavigation, LsgPagination, LsgQuickLinks, LsgSearchOverlay, LsgSearchTrigger, LsgSocialMediaIcons, LsgTable, Theme1LsgBanner, Theme1LsgBlogOverview, Theme1LsgBreadcrumb, Theme1LsgButton, Theme1LsgCard, Theme1LsgCards, Theme1LsgCarousel, Theme1LsgFooter, Theme1LsgGeneratedList, Theme1LsgHeader, Theme1LsgHero, Theme1LsgLanguageSwitcher, Theme1LsgLogo, Theme1LsgNavigation, Theme1LsgPagination, Theme1LsgQuickLinks, Theme1LsgSearchOverlay, Theme1LsgSearchTrigger, Theme1LsgSocialMediaIcons, Theme1LsgTable, Theme2LsgBanner, Theme2LsgBlogOverview, Theme2LsgBreadcrumb, Theme2LsgButton, Theme2LsgCard, Theme2LsgCards, Theme2LsgCarousel, Theme2LsgFooter, Theme2LsgGeneratedList, Theme2LsgHeader, Theme2LsgHero, Theme2LsgLanguageSwitcher, Theme2LsgLogo, Theme2LsgNavigation, Theme2LsgPagination, Theme2LsgQuickLinks, Theme2LsgSearchOverlay, Theme2LsgSearchTrigger, Theme2LsgSocialMediaIcons, Theme2LsgTable, Theme3LsgBanner, Theme3LsgBlogOverview, Theme3LsgBreadcrumb, Theme3LsgButton, Theme3LsgCard, Theme3LsgCards, Theme3LsgCarousel, Theme3LsgFooter, Theme3LsgGeneratedList, Theme3LsgHeader, Theme3LsgHero, Theme3LsgLanguageSwitcher, Theme3LsgLogo, Theme3LsgNavigation, Theme3LsgPagination, Theme3LsgQuickLinks, Theme3LsgSearchOverlay, Theme3LsgSearchTrigger, Theme3LsgSocialMediaIcons, Theme3LsgTable, getLsgPaginationRange, getTelValue, initTelPickers, mapAemGeneratedListJson, theme1Components, theme2Components, theme3Components };
5477
5936
  //# sourceMappingURL=index.esm.js.map