@asante-org/atlascopco-vt-litesitegenerator 3.0.18 → 3.0.19

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 (34) hide show
  1. package/dist/index.esm.js +251 -10
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/index.esm.scss +900 -8
  4. package/dist/index.js +251 -10
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.scss +900 -8
  7. package/dist/src/components/lsg/LsgHeader/LsgHeaderInSitu.stories.d.ts +8 -0
  8. package/dist/src/components/lsg/LsgTabs/LsgTabs.d.ts +19 -0
  9. package/dist/src/components/lsg/LsgTabs/LsgTabs.stories.d.ts +12 -0
  10. package/dist/src/components/lsg/LsgTabs/index.d.ts +2 -0
  11. package/dist/src/components/lsg/index.d.ts +2 -0
  12. package/dist/src/components/lsg/lsg-clientlib-runtime.d.ts +1 -0
  13. package/dist/src/themes/createThemeComponents.d.ts +1 -0
  14. package/dist/src/themes/theme-1/components.d.ts +2 -1
  15. package/dist/src/themes/theme-2/components.d.ts +1 -0
  16. package/dist/src/themes/theme-3/components.d.ts +1 -0
  17. package/dist/themes/theme-1.css +445 -10
  18. package/dist/themes/theme-1.css.map +1 -1
  19. package/dist/themes/theme-1.js +184 -0
  20. package/dist/themes/theme-1.js.map +1 -1
  21. package/dist/themes/theme-2.css +575 -16
  22. package/dist/themes/theme-2.css.map +1 -1
  23. package/dist/themes/theme-2.js +184 -0
  24. package/dist/themes/theme-2.js.map +1 -1
  25. package/dist/themes/theme-3.css +676 -14
  26. package/dist/themes/theme-3.css.map +1 -1
  27. package/dist/themes/theme-3.js +184 -0
  28. package/dist/themes/theme-3.js.map +1 -1
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +1 -1
  31. package/dist/lsg-clientlib.css +0 -2106
  32. package/dist/lsg-clientlib.css.map +0 -1
  33. package/dist/lsg-clientlib.js +0 -524
  34. package/dist/lsg-clientlib.js.map +0 -1
package/dist/index.esm.js CHANGED
@@ -871,7 +871,14 @@ var LsgHeader = function (_a) {
871
871
  })));
872
872
  }))));
873
873
  };
874
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("header", {
874
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LsgSearchOverlay, {
875
+ id: SEARCH_OVERLAY_ID,
876
+ isOpen: searchOpen,
877
+ onClose: function () {
878
+ return setSearchOpen(false);
879
+ },
880
+ placeholder: searchPlaceholder
881
+ }), /*#__PURE__*/React.createElement("header", {
875
882
  ref: headerRef,
876
883
  className: ["lsg-header", "lsg-header--".concat(variant), menuOpen ? "lsg-header--menu-open" : "", "lsg-header--mobile-level-".concat(mobileLevel)].filter(Boolean).join(" ")
877
884
  }, /*#__PURE__*/React.createElement("div", {
@@ -917,14 +924,7 @@ var LsgHeader = function (_a) {
917
924
  "data-lsg-menu-trigger": true
918
925
  }, /*#__PURE__*/React.createElement(LsgHeaderIcon, {
919
926
  name: mobileOpen ? "close" : "bars"
920
- })))), variant === "mega" && menuOpen && (children || renderMegaPanel()), mobileOpen && renderMobileMenu()), /*#__PURE__*/React.createElement(LsgSearchOverlay, {
921
- id: SEARCH_OVERLAY_ID,
922
- isOpen: searchOpen,
923
- onClose: function () {
924
- return setSearchOpen(false);
925
- },
926
- placeholder: searchPlaceholder
927
- }));
927
+ })))), variant === "mega" && menuOpen && (children || renderMegaPanel()), mobileOpen && renderMobileMenu()));
928
928
  };
929
929
 
930
930
  var LsgQuickLinks = function (_a) {
@@ -3548,6 +3548,244 @@ var LsgHero = function (_a) {
3548
3548
  }))));
3549
3549
  };
3550
3550
 
3551
+ // Matches $lsg-tabs-accordion-breakpoint in LsgTabs.scss ($breakpoint-sm - 1px)
3552
+ // and MOBILE_MEDIA_QUERY in lsg-clientlib-runtime.ts.
3553
+ var MOBILE_MEDIA_QUERY = "(max-width: 767px)";
3554
+ // Sub-pixel layout rounding when comparing scroll offsets against extents
3555
+ var SCROLL_EPSILON = 1;
3556
+ var CHEVRON_SVG = /*#__PURE__*/React.createElement("svg", {
3557
+ className: "lsg-tabs__tab-icon-svg",
3558
+ width: "16",
3559
+ height: "16",
3560
+ viewBox: "0 0 16 16",
3561
+ fill: "none",
3562
+ xmlns: "http://www.w3.org/2000/svg",
3563
+ "aria-hidden": "true",
3564
+ focusable: "false"
3565
+ }, /*#__PURE__*/React.createElement("path", {
3566
+ d: "M3 6L8 11L13 6",
3567
+ stroke: "currentColor",
3568
+ strokeWidth: "1.5",
3569
+ strokeLinecap: "round",
3570
+ strokeLinejoin: "round"
3571
+ }));
3572
+ var LsgTabs = function (_a) {
3573
+ var _b, _c;
3574
+ var items = _a.items,
3575
+ activeId = _a.activeId,
3576
+ _d = _a.variant,
3577
+ variant = _d === void 0 ? "default" : _d,
3578
+ accessibilityLabel = _a.accessibilityLabel,
3579
+ _e = _a.className,
3580
+ className = _e === void 0 ? "" : _e;
3581
+ var _f = useState((_c = activeId !== null && activeId !== void 0 ? activeId : (_b = items[0]) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : ""),
3582
+ selectedId = _f[0],
3583
+ setSelectedId = _f[1];
3584
+ // Below the breakpoint the tabs render as a single-open accordion and the open
3585
+ // header can be collapsed. Tracked separately from selection so exactly one tab
3586
+ // stays selected at every width — resizing back to desktop just reveals it again.
3587
+ var _g = useState(false),
3588
+ collapsed = _g[0],
3589
+ setCollapsed = _g[1];
3590
+ var _h = useState(false),
3591
+ isMobile = _h[0],
3592
+ setIsMobile = _h[1];
3593
+ // Scroll-arrow state. The arrows themselves are ::before / ::after on the root
3594
+ // (see LsgTabs.scss) — these only say whether there is more to reveal.
3595
+ var _j = useState(false),
3596
+ scrollStart = _j[0],
3597
+ setScrollStart = _j[1];
3598
+ var _k = useState(false),
3599
+ scrollEnd = _k[0],
3600
+ setScrollEnd = _k[1];
3601
+ var tabRefs = useRef({});
3602
+ var stripRef = useRef(null);
3603
+ var isVertical = variant === "vertical";
3604
+ var selectedIndex = Math.max(0, items.findIndex(function (item) {
3605
+ return item.id === selectedId;
3606
+ }));
3607
+ useEffect(function () {
3608
+ var mql = window.matchMedia(MOBILE_MEDIA_QUERY);
3609
+ var sync = function () {
3610
+ return setIsMobile(mql.matches);
3611
+ };
3612
+ sync();
3613
+ mql.addEventListener("change", sync);
3614
+ return function () {
3615
+ return mql.removeEventListener("change", sync);
3616
+ };
3617
+ }, []);
3618
+ var updateArrows = function () {
3619
+ var strip = stripRef.current;
3620
+ // Below the breakpoint this is an accordion — nothing scrolls, so the arrows
3621
+ // must not be offered.
3622
+ if (!strip || isMobile) {
3623
+ setScrollStart(false);
3624
+ setScrollEnd(false);
3625
+ return;
3626
+ }
3627
+ var offset = isVertical ? strip.scrollTop : strip.scrollLeft;
3628
+ var visible = isVertical ? strip.clientHeight : strip.clientWidth;
3629
+ var total = isVertical ? strip.scrollHeight : strip.scrollWidth;
3630
+ setScrollStart(offset > SCROLL_EPSILON);
3631
+ setScrollEnd(offset + visible < total - SCROLL_EPSILON);
3632
+ };
3633
+ useEffect(function () {
3634
+ updateArrows();
3635
+ }, [isMobile, isVertical, items, selectedIndex]);
3636
+ useEffect(function () {
3637
+ var strip = stripRef.current;
3638
+ if (!strip || typeof ResizeObserver === "undefined") return;
3639
+ // The strip can start overflowing because its container changed, with no
3640
+ // viewport resize at all.
3641
+ var observer = new ResizeObserver(function () {
3642
+ return updateArrows();
3643
+ });
3644
+ observer.observe(strip);
3645
+ return function () {
3646
+ return observer.disconnect();
3647
+ };
3648
+ }, [isMobile, isVertical]);
3649
+ useEffect(function () {
3650
+ var _a;
3651
+ // A late web-font swap widens the labels, growing scrollWidth without changing
3652
+ // the strip's own box — so ResizeObserver may never fire. Re-measure once the
3653
+ // fonts have settled, otherwise the arrows can be stale on first paint.
3654
+ var cancelled = false;
3655
+ (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.ready.then(function () {
3656
+ if (!cancelled) updateArrows();
3657
+ });
3658
+ return function () {
3659
+ cancelled = true;
3660
+ };
3661
+ }, [isMobile, isVertical]);
3662
+ var scrollStrip = function (direction) {
3663
+ var strip = stripRef.current;
3664
+ if (!strip) return;
3665
+ // A step just under one viewport keeps a sliver of context in view
3666
+ var visible = isVertical ? strip.clientHeight : strip.clientWidth;
3667
+ var step = Math.max(visible * 0.8, 1);
3668
+ if (isVertical) {
3669
+ strip.scrollTop += direction * step;
3670
+ } else {
3671
+ strip.scrollLeft += direction * step;
3672
+ }
3673
+ };
3674
+ // The arrows are pseudo-elements painted above the strip, so a click on one
3675
+ // hit-tests to the root rather than to a tab or panel. Nothing else on the root
3676
+ // is clickable, which is what makes this unambiguous.
3677
+ var onRootClick = function (event) {
3678
+ if (event.target !== event.currentTarget) return;
3679
+ var strip = stripRef.current;
3680
+ if (!strip) return;
3681
+ var rect = strip.getBoundingClientRect();
3682
+ var beforeMidpoint = isVertical ? event.clientY < rect.top + rect.height / 2 : event.clientX < rect.left + rect.width / 2;
3683
+ scrollStrip(beforeMidpoint ? -1 : 1);
3684
+ };
3685
+ var select = function (index, moveFocus) {
3686
+ var item = items[index];
3687
+ if (!item) return;
3688
+ setSelectedId(item.id);
3689
+ setCollapsed(false);
3690
+ var tab = tabRefs.current[item.id];
3691
+ // Arrow-key navigation can land on a tab that is scrolled out of the strip
3692
+ tab === null || tab === void 0 ? void 0 : tab.scrollIntoView({
3693
+ block: "nearest",
3694
+ inline: "nearest"
3695
+ });
3696
+ if (moveFocus) tab === null || tab === void 0 ? void 0 : tab.focus();
3697
+ };
3698
+ var press = function (index) {
3699
+ if (isMobile && index === selectedIndex) {
3700
+ setCollapsed(function (prev) {
3701
+ return !prev;
3702
+ });
3703
+ return;
3704
+ }
3705
+ select(index, false);
3706
+ };
3707
+ // Roving tabindex keyboard model for role="tab" — see bootLsgTabs for the AEM twin.
3708
+ var onKeyDown = function (event, index) {
3709
+ var last = items.length - 1;
3710
+ switch (event.key) {
3711
+ case "ArrowRight":
3712
+ case "ArrowDown":
3713
+ event.preventDefault();
3714
+ select(selectedIndex === last ? 0 : selectedIndex + 1, true);
3715
+ break;
3716
+ case "ArrowLeft":
3717
+ case "ArrowUp":
3718
+ event.preventDefault();
3719
+ select(selectedIndex === 0 ? last : selectedIndex - 1, true);
3720
+ break;
3721
+ case "Home":
3722
+ event.preventDefault();
3723
+ select(0, true);
3724
+ break;
3725
+ case "End":
3726
+ event.preventDefault();
3727
+ select(last, true);
3728
+ break;
3729
+ case "Enter":
3730
+ case " ":
3731
+ event.preventDefault();
3732
+ press(index);
3733
+ break;
3734
+ }
3735
+ };
3736
+ var rootClass = ["lsg-tabs", isVertical ? "lsg-tabs--vertical" : "", scrollStart ? "lsg-tabs--scroll-start" : "", scrollEnd ? "lsg-tabs--scroll-end" : "", className].filter(Boolean).join(" ");
3737
+ return /*#__PURE__*/React.createElement("div", {
3738
+ className: rootClass,
3739
+ onClick: onRootClick
3740
+ }, /*#__PURE__*/React.createElement("ol", {
3741
+ ref: stripRef,
3742
+ className: "lsg-tabs__tablist",
3743
+ role: "tablist",
3744
+ "aria-label": accessibilityLabel,
3745
+ "aria-multiselectable": "false",
3746
+ onScroll: updateArrows
3747
+ }, items.map(function (item, index) {
3748
+ var isActive = index === selectedIndex;
3749
+ return /*#__PURE__*/React.createElement("li", {
3750
+ key: item.id,
3751
+ ref: function (node) {
3752
+ tabRefs.current[item.id] = node;
3753
+ },
3754
+ role: "tab",
3755
+ id: "lsg-tab-".concat(item.id),
3756
+ className: "lsg-tabs__tab".concat(isActive ? " lsg-tabs__tab--active" : ""),
3757
+ "aria-controls": "lsg-tabpanel-".concat(item.id),
3758
+ "aria-selected": isActive
3759
+ // Desktop is a tab strip — aria-selected carries the state there, and
3760
+ // the collapsed class has no styling, so aria-expanded would mislead.
3761
+ ,
3762
+ "aria-expanded": isMobile ? isActive && !collapsed : undefined,
3763
+ tabIndex: isActive ? 0 : -1,
3764
+ onClick: function () {
3765
+ return press(index);
3766
+ },
3767
+ onKeyDown: function (event) {
3768
+ return onKeyDown(event, index);
3769
+ }
3770
+ }, /*#__PURE__*/React.createElement("span", {
3771
+ className: "lsg-tabs__tab-label"
3772
+ }, item.title), /*#__PURE__*/React.createElement("span", {
3773
+ className: "lsg-tabs__tab-icon",
3774
+ "aria-hidden": "true"
3775
+ }, CHEVRON_SVG));
3776
+ })), items.map(function (item, index) {
3777
+ var isActive = index === selectedIndex;
3778
+ return /*#__PURE__*/React.createElement("div", {
3779
+ key: item.id,
3780
+ id: "lsg-tabpanel-".concat(item.id),
3781
+ role: "tabpanel",
3782
+ "aria-labelledby": "lsg-tab-".concat(item.id),
3783
+ tabIndex: 0,
3784
+ className: ["lsg-tabs__panel", isActive ? "lsg-tabs__panel--active" : "", isActive && collapsed ? "lsg-tabs__panel--collapsed" : ""].filter(Boolean).join(" ")
3785
+ }, item.content);
3786
+ }));
3787
+ };
3788
+
3551
3789
  var LsgFormFieldText = function (_a) {
3552
3790
  var _b = _a.id,
3553
3791
  id = _b === void 0 ? "field-text" : _b,
@@ -4291,6 +4529,7 @@ var BASE_COMPONENTS = {
4291
4529
  LsgSocialMediaIcons: LsgSocialMediaIcons,
4292
4530
  LsgFooter: LsgFooter,
4293
4531
  LsgHero: LsgHero,
4532
+ LsgTabs: LsgTabs,
4294
4533
  LsgFormContainer: LsgFormContainer,
4295
4534
  LsgFormFieldText: LsgFormFieldText,
4296
4535
  LsgFormFieldEmail: LsgFormFieldEmail,
@@ -4334,7 +4573,8 @@ function createThemeComponents(themeName) {
4334
4573
  LsgFormFieldCountry: createThemeComponent(themeName, "form-field-country", BASE_COMPONENTS.LsgFormFieldCountry),
4335
4574
  LsgFormFieldTextarea: createThemeComponent(themeName, "form-field-textarea", BASE_COMPONENTS.LsgFormFieldTextarea),
4336
4575
  LsgFormFieldConsent: createThemeComponent(themeName, "form-field-consent", BASE_COMPONENTS.LsgFormFieldConsent),
4337
- LsgFormStep: createThemeComponent(themeName, "form-step", BASE_COMPONENTS.LsgFormStep)
4576
+ LsgFormStep: createThemeComponent(themeName, "form-step", BASE_COMPONENTS.LsgFormStep),
4577
+ LsgTabs: createThemeComponent(themeName, "tabs", BASE_COMPONENTS.LsgTabs)
4338
4578
  };
4339
4579
  }
4340
4580
 
@@ -4353,6 +4593,7 @@ var Theme1LsgButton = theme1Components.LsgButton,
4353
4593
  Theme1LsgSocialMediaIcons = theme1Components.LsgSocialMediaIcons,
4354
4594
  Theme1LsgFooter = theme1Components.LsgFooter,
4355
4595
  Theme1LsgHero = theme1Components.LsgHero;
4596
+ theme1Components.LsgTabs;
4356
4597
  // Form components
4357
4598
  theme1Components.LsgFormContainer;
4358
4599
  theme1Components.LsgFormFieldText;