willba-component-library 0.4.1 → 0.4.3

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/lib/index.js CHANGED
@@ -532,8 +532,13 @@ var useCloseFilterSection = function (_a) {
532
532
  var filterSectionRef = React.useRef(null);
533
533
  React.useEffect(function () {
534
534
  var handleClickOutside = function (event) {
535
- if (filterSectionRef.current &&
536
- !filterSectionRef.current.contains(event.target)) {
535
+ if (!filterSectionRef.current)
536
+ return;
537
+ // composedPath() walks through Shadow DOM boundaries; event.target is
538
+ // retargeted to the shadow host when crossing them, which would falsely
539
+ // report clicks inside the panel as "outside".
540
+ var path = event.composedPath();
541
+ if (!path.includes(filterSectionRef.current)) {
537
542
  handleSelectedFilter(false);
538
543
  }
539
544
  };
@@ -3088,21 +3093,17 @@ var fiCommon = {
3088
3093
  errors: errors
3089
3094
  };
3090
3095
 
3096
+ var DEFAULT_LANGUAGE = 'fi';
3091
3097
  var resources = {
3092
3098
  en: { filterBar: enFilterBar, common: enCommon },
3093
3099
  fi: { filterBar: fiFilterBar, common: fiCommon },
3094
3100
  };
3095
- var readLocaleFromUrl = function () {
3096
- if (typeof window === 'undefined')
3097
- return null;
3098
- return new URLSearchParams(window.location.search).get('locale');
3099
- };
3100
3101
  var createI18nInstance = function (language) {
3101
3102
  var instance$1 = instance.createInstance();
3102
3103
  instance$1.use(initReactI18next).init({
3103
3104
  resources: resources,
3104
- lng: language || readLocaleFromUrl() || 'fi',
3105
- fallbackLng: 'fi',
3105
+ lng: language || DEFAULT_LANGUAGE,
3106
+ fallbackLng: DEFAULT_LANGUAGE,
3106
3107
  interpolation: { escapeValue: false },
3107
3108
  });
3108
3109
  return instance$1;
@@ -3110,7 +3111,7 @@ var createI18nInstance = function (language) {
3110
3111
 
3111
3112
  var I18nProvider = function (_a) {
3112
3113
  var language = _a.language, children = _a.children;
3113
- var i18n = React.useMemo(function () { return createI18nInstance(language); }, []);
3114
+ var i18n = React.useMemo(function () { return createI18nInstance(language); }, [language]);
3114
3115
  return React.createElement(I18nextProvider, { i18n: i18n }, children);
3115
3116
  };
3116
3117
 
@@ -11897,25 +11898,38 @@ var checkForContinuousSelection = function (_a) {
11897
11898
  });
11898
11899
  };
11899
11900
 
11901
+ // Returns the nearest queryable root for an element. Inside a Shadow DOM this
11902
+ // returns the ShadowRoot (so `querySelector` searches inside the shadow tree);
11903
+ // otherwise returns `document`. Both support `querySelector`/`querySelectorAll`.
11904
+ var getQueryRoot = function (el) {
11905
+ var root = el === null || el === void 0 ? void 0 : el.getRootNode();
11906
+ if (root instanceof ShadowRoot)
11907
+ return root;
11908
+ return document;
11909
+ };
11910
+
11900
11911
  var useCalendarTooltips = function (_a) {
11901
- var showFeedback = _a.showFeedback;
11912
+ var showFeedback = _a.showFeedback, rootRef = _a.rootRef;
11902
11913
  return React.useEffect(function () {
11903
11914
  if (typeof document === 'undefined' || !showFeedback)
11904
11915
  return;
11916
+ // Use the calendar's own DOM root (ShadowRoot or Document) so queries
11917
+ // resolve correctly when the component is mounted inside Shadow DOM.
11918
+ var root = getQueryRoot(rootRef === null || rootRef === void 0 ? void 0 : rootRef.current);
11905
11919
  // Children
11906
- var calendarTooltip = document.querySelector('.will-calendar-tooltip');
11907
- var calendarTooltipCheckOut = document.querySelector('.will-calendar-tooltip-check-out');
11908
- var calendarTooltipOverlappingDate = document.querySelector('.will-calendar-tooltip-overlapping-date');
11909
- var loadingSpinner = document.querySelector('.will-filter-bar-calendar .will-calendar-spinner');
11910
- var calendarTooltipCheckInOnly = document.querySelector('.will-calendar-tooltip-check-in-only');
11911
- var calendarTooltipCheckOutOnly = document.querySelector('.will-calendar-tooltip-check-out-only');
11920
+ var calendarTooltip = root.querySelector('.will-calendar-tooltip');
11921
+ var calendarTooltipCheckOut = root.querySelector('.will-calendar-tooltip-check-out');
11922
+ var calendarTooltipOverlappingDate = root.querySelector('.will-calendar-tooltip-overlapping-date');
11923
+ var loadingSpinner = root.querySelector('.will-filter-bar-calendar .will-calendar-spinner');
11924
+ var calendarTooltipCheckInOnly = root.querySelector('.will-calendar-tooltip-check-in-only');
11925
+ var calendarTooltipCheckOutOnly = root.querySelector('.will-calendar-tooltip-check-out-only');
11912
11926
  // Parents
11913
- var calendarButtons = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked):not(:has(.disabled-after-check-in))');
11914
- var calendarButtonsCheckOut = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked.disabled-after-check-in)');
11915
- var calendarMonthContainer = document.querySelector('.will-filter-bar-calendar .rdp-months');
11916
- var calendarOverlappingDate = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.overlapping-date)');
11917
- var calendarCheckInOnly = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-in-only)');
11918
- var calendarCheckOutOnly = document.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-out-only)');
11927
+ var calendarButtons = root.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked):not(:has(.disabled-after-check-in))');
11928
+ var calendarButtonsCheckOut = root.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.booked.disabled-after-check-in)');
11929
+ var calendarMonthContainer = root.querySelector('.will-filter-bar-calendar .rdp-months');
11930
+ var calendarOverlappingDate = root.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.overlapping-date)');
11931
+ var calendarCheckInOnly = root.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-in-only)');
11932
+ var calendarCheckOutOnly = root.querySelectorAll('.will-filter-bar-calendar .rdp-cell:has(.check-out-only)');
11919
11933
  // Append children to parents
11920
11934
  var tooltipClonesCheckIn = [];
11921
11935
  var tooltipClonesCheckOut = [];
@@ -11975,11 +11989,12 @@ var useCalendarTooltips = function (_a) {
11975
11989
  };
11976
11990
 
11977
11991
  var useCalendarLoadingSpinner = function (_a) {
11978
- var loadingData = _a.loadingData;
11992
+ var loadingData = _a.loadingData, rootRef = _a.rootRef;
11979
11993
  return React.useEffect(function () {
11980
11994
  if (typeof document === 'undefined')
11981
11995
  return;
11982
- var loadingSpinner = document.querySelector('.will-filter-bar-calendar .rdp-months .will-calendar-spinner');
11996
+ var root = getQueryRoot(rootRef === null || rootRef === void 0 ? void 0 : rootRef.current);
11997
+ var loadingSpinner = root.querySelector('.will-filter-bar-calendar .rdp-months .will-calendar-spinner');
11983
11998
  if (loadingData) {
11984
11999
  if (loadingSpinner)
11985
12000
  loadingSpinner.style.display = 'flex';
@@ -12078,10 +12093,12 @@ var Calendar = React.forwardRef(function (_a, ref) {
12078
12093
  // Handle tooltip
12079
12094
  useCalendarTooltips({
12080
12095
  showFeedback: showFeedback,
12096
+ rootRef: calendarContainerRef,
12081
12097
  });
12082
12098
  // Handle loading spinner
12083
12099
  useCalendarLoadingSpinner({
12084
12100
  loadingData: loadingData,
12101
+ rootRef: calendarContainerRef,
12085
12102
  });
12086
12103
  // Handle the date selection and availability for selection logic.
12087
12104
  var handleOnSelect = function (range) {
@@ -12626,11 +12643,9 @@ var renderCalendarErrorMessage = function (_a) {
12626
12643
  var css_248z = ".will-root .will-calendar-wrapper {\n box-shadow: var(--will-box-shadow-dark);\n border-radius: 20px;\n background-color: var(--will-white);\n position: absolute;\n top: 0;\n left: 0;\n \n}\n\n.will-root .will-calendar-wrapper .will-calendar-header,\n.will-root .will-calendar-wrapper .will-calendar-main,\n.will-root .will-calendar-wrapper .will-calendar-footer {\n padding: 20px;\n}\n\n/* Header */\n\n.will-root .will-calendar-wrapper .will-calendar-header {\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid var(--will-grey);\n align-items: center;\n}\n\n/* Footer */\n\n.will-root .will-calendar-wrapper .will-calendar-footer {\n border-top: 1px solid var(--will-grey);\n}\n\n/* Footer actions */\n\n.will-root .will-calendar-wrapper .will-calendar-footer-actions-wrapper {\n display: flex;\n justify-content: space-between;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates > div {\n margin-bottom: 5px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates-separator {\n margin: 0 15px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-dates .will-calendar-footer-booked {\n display: flex;\n min-height: 20.5px;\n margin-top: 10px;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-error {\n display: flex;\n max-width: 80%;\n}\n\n.will-root .will-calendar-wrapper .will-calendar-footer-error span {\n display: inline-block;\n margin-left: 10px;\n}\n\n@media (max-width: 960px) {\n .will-root .will-calendar-wrapper {\n width: -webkit-fill-available;\n margin: 0 -6%;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-header,\n .will-root .will-calendar-wrapper .will-calendar-main,\n .will-root .will-calendar-wrapper .will-calendar-footer {\n padding: 20px 10px;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions-wrapper {\n flex-direction: column;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-dates {\n text-align: center;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-dates .will-calendar-footer-booked {\n justify-content: center;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions {\n flex-direction: column;\n width: 100%;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-actions button{\n width: 100%;\n margin-top: 10px;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-error {\n max-width: 100%;\n }\n\n .will-root .will-calendar-wrapper .will-calendar-footer-error span {\n text-align: center;\n margin-left: 5px;\n }\n }\n\n.will-root .will-calendar-wrapper .will-calendar-header .will-filter-bar-close-button {\n position: initial;\n}";
12627
12644
  styleInject(css_248z);
12628
12645
 
12629
- function FilterCalendar(props) {
12630
- return (React.createElement(I18nProvider, { language: props.language },
12631
- React.createElement(FilterCalendarInner, __assign$2({}, props))));
12632
- }
12633
- function FilterCalendarInner(_a) {
12646
+ var FilterCalendar = function (props) { return (React.createElement(I18nProvider, { language: props.language },
12647
+ React.createElement(FilterCalendarInner, __assign$2({}, props)))); };
12648
+ var FilterCalendarInner = function (_a) {
12634
12649
  var calendarOffset = _a.calendarOffset, language = _a.language, palette = _a.palette, onSubmit = _a.onSubmit, outerDisableCalendarDates = _a.disableCalendarDates, toggleCalendar = _a.toggleCalendar, loadingData = _a.loadingData, setToggleCalendar = _a.setToggleCalendar, requestDates = _a.requestDates, showFeedback = _a.showFeedback, noActiveSelection = _a.noActiveSelection, outerRangeContext = _a.rangeContext;
12635
12650
  var themePalette = useTheme({ palette: palette });
12636
12651
  // Translations
@@ -12658,7 +12673,7 @@ function FilterCalendarInner(_a) {
12658
12673
  React.createElement(Calendar, { calendarRange: calendarRange, setCalendarRange: setCalendarRange, calendarOffset: calendarOffset, selectedPath: '/rooms', language: language, disableCalendarDates: disableCalendarDates, requestDates: requestDates, disabledDates: disabledDates, updateCalendarMonthNavigation: updateCalendarMonthNavigation, setUpdateCalendarMonthNavigation: setUpdateCalendarMonthNavigation, updateCalendarDefaultMonth: updateCalendarDefaultMonth, loadingData: loadingData, showFeedback: showFeedback, noActiveSelection: noActiveSelection, palette: palette, setCalendarHasError: setCalendarHasError, setUpdatedForSubmit: setUpdatedForSubmit, rangeContext: rangeContext, calendarHasError: calendarHasError })),
12659
12674
  React.createElement("div", { className: "will-calendar-footer" },
12660
12675
  React.createElement(Footer, { calendarHasError: calendarHasError, calendarRange: calendarRange, handleClearDates: handleClearDates, language: language, palette: palette }))))));
12661
- }
12676
+ };
12662
12677
 
12663
12678
  exports.Button = Button$1;
12664
12679
  exports.FilterBar = FilterBar;