@roomstay/frontend 2.9.1-2 → 2.10.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.
Files changed (114) hide show
  1. package/dist/177.bundle.js +1 -1
  2. package/dist/288.bundle.js +1 -1
  3. package/dist/326.bundle.js +2 -0
  4. package/dist/446.bundle.js +1 -1
  5. package/dist/537.bundle.js +1 -1
  6. package/dist/596.bundle.js +1 -1
  7. package/dist/625.bundle.js +1 -1
  8. package/dist/686.bundle.js +1 -0
  9. package/dist/836.bundle.js +1 -1
  10. package/dist/main.bundle.js +1 -1
  11. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js +0 -6
  12. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js.map +1 -1
  13. package/dist/src/components/generic/Portal/Portal.js +1 -5
  14. package/dist/src/components/generic/Portal/Portal.js.map +1 -1
  15. package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.d.ts +2 -2
  16. package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map +1 -1
  17. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.d.ts +0 -4
  18. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js +30 -105
  19. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js.map +1 -1
  20. package/dist/src/components/members/SignInModal/ExternalMemberModal.d.ts +3 -9
  21. package/dist/src/components/members/SignInModal/ExternalMemberModal.js +6 -45
  22. package/dist/src/components/members/SignInModal/ExternalMemberModal.js.map +1 -1
  23. package/dist/src/components/steps/date/BEPeoplePickerBlock.js +1 -3
  24. package/dist/src/components/steps/date/BEPeoplePickerBlock.js.map +1 -1
  25. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js +0 -2
  26. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js.map +1 -1
  27. package/dist/src/components/steps/room/roomDetails/RoomDetails.d.ts +1 -0
  28. package/dist/src/components/steps/room/roomDetails/RoomDetails.js +18 -4
  29. package/dist/src/components/steps/room/roomDetails/RoomDetails.js.map +1 -1
  30. package/dist/src/components/steps/room/roomDetails/roomRates/BookNowButton.d.ts +1 -0
  31. package/dist/src/components/steps/room/roomDetails/roomRates/BookNowButton.js +1 -1
  32. package/dist/src/components/steps/room/roomDetails/roomRates/BookNowButton.js.map +1 -1
  33. package/dist/src/components/summary/BESummaryRoomRow.js.map +1 -1
  34. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +1 -1
  35. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  36. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +1 -0
  37. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  38. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +0 -1
  39. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  40. package/dist/src/contexts/HotelOverridesContext.js +4 -0
  41. package/dist/src/contexts/HotelOverridesContext.js.map +1 -1
  42. package/dist/src/contexts/index.d.ts +0 -2
  43. package/dist/src/contexts/index.js +0 -2
  44. package/dist/src/contexts/index.js.map +1 -1
  45. package/dist/src/engines/BaseEngine.d.ts +0 -13
  46. package/dist/src/engines/BaseEngine.js +0 -32
  47. package/dist/src/engines/BaseEngine.js.map +1 -1
  48. package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js +0 -1
  49. package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js.map +1 -1
  50. package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js +1 -3
  51. package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js.map +1 -1
  52. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js +0 -1
  53. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js.map +1 -1
  54. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +10 -12
  55. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
  56. package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js +0 -1
  57. package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js.map +1 -1
  58. package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js +9 -11
  59. package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js.map +1 -1
  60. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js +0 -1
  61. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js.map +1 -1
  62. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js +2 -4
  63. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js.map +1 -1
  64. package/dist/src/handlers/membership/SalesforceMemberHandler.js +1 -1
  65. package/dist/src/handlers/membership/SalesforceMemberHandler.js.map +1 -1
  66. package/dist/src/hooks/BodyClickHook.d.ts +2 -2
  67. package/dist/src/hooks/BodyClickHook.js +3 -7
  68. package/dist/src/hooks/BodyClickHook.js.map +1 -1
  69. package/dist/src/models/Api/HotelDTO.d.ts +2 -0
  70. package/dist/src/models/Api/HotelDTO.js.map +1 -1
  71. package/dist/src/models/Api/HotelOverrideDTO.d.ts +1 -0
  72. package/dist/src/models/Api/HotelOverrideDTO.js.map +1 -1
  73. package/dist/src/models/Client/Hotel/Hotel.d.ts +2 -0
  74. package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
  75. package/dist/src/pages/findReservation/FindReservationResults.js +1 -1
  76. package/dist/src/pages/findReservation/FindReservationResults.js.map +1 -1
  77. package/dist/src/pages/findReservation/ReservationRow.js +9 -10
  78. package/dist/src/pages/findReservation/ReservationRow.js.map +1 -1
  79. package/dist/src/pages/hotel/HotelInfo.js +6 -7
  80. package/dist/src/pages/hotel/HotelInfo.js.map +1 -1
  81. package/dist/src/pages/steps/StepConfirmation/StepConfirmationComponent.js +7 -1
  82. package/dist/src/pages/steps/StepConfirmation/StepConfirmationComponent.js.map +1 -1
  83. package/dist/src/providers/RoomstayThemeEngine.js +2 -7
  84. package/dist/src/providers/RoomstayThemeEngine.js.map +1 -1
  85. package/dist/src/providers/storage/SessionProvider.js.map +1 -1
  86. package/dist/src/stories/EnhancedPhoneNumberField.stories.d.ts +1 -1
  87. package/dist/src/translations/Translation.d.ts +0 -3
  88. package/dist/src/translations/Translation.js +0 -3
  89. package/dist/src/translations/Translation.js.map +1 -1
  90. package/dist/src/translations/languages/en-gb.js +0 -3
  91. package/dist/src/translations/languages/en-gb.js.map +1 -1
  92. package/dist/src/util/Analytics/Analytics.js +0 -1
  93. package/dist/src/util/Analytics/Analytics.js.map +1 -1
  94. package/dist/test.bundle.js +1 -1
  95. package/dist/vendors.bundle.js +1 -1
  96. package/package.json +2 -2
  97. package/dist/219.bundle.js +0 -2
  98. package/dist/291.bundle.js +0 -1
  99. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.d.ts +0 -22
  100. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js +0 -131
  101. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js.map +0 -1
  102. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.d.ts +0 -10
  103. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js +0 -12
  104. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js.map +0 -1
  105. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.d.ts +0 -8
  106. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js +0 -13
  107. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js.map +0 -1
  108. package/dist/src/providers/ShadowDomManager.d.ts +0 -21
  109. package/dist/src/providers/ShadowDomManager.js +0 -55
  110. package/dist/src/providers/ShadowDomManager.js.map +0 -1
  111. package/dist/src/providers/StyleInjector.d.ts +0 -42
  112. package/dist/src/providers/StyleInjector.js +0 -118
  113. package/dist/src/providers/StyleInjector.js.map +0 -1
  114. /package/dist/{219.bundle.js.LICENSE.txt → 326.bundle.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- "use strict";(("undefined"!=typeof self?self:this).webpackChunkroomstay=("undefined"!=typeof self?self:this).webpackChunkroomstay||[]).push([[291],{71291:function(e,n,t){t.d(n,{c:function(){return Z},u:function(){return O}});var r=t(42982),o=t(4942),a=t(15861),u=t(70885),i=t(64687),s=t.n(i),l=t(94184),c=t.n(l),f=t(67294),d=t(62364),v=t(41321),p=t(514);function m(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return y(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?y(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){t&&(e=t);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,i=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return u=e.done,e},e:function(e){i=!0,a=e},f:function(){try{u||null==t.return||t.return()}finally{if(i)throw a}}}}function y(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}function h(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function g(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?h(Object(t),!0).forEach((function(n){(0,o.Z)(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):h(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}var b,w=null,S=null,j=function(){var e,n,t,r,o,a,u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"standard",i=(0,p.W)().hotel,s=null!==(e=null==i||null===(n=i.vgs)||void 0===n||null===(t=n.vaultNames)||void 0===t?void 0:t.members)&&void 0!==e?e:"tntjyo5u2pi",l=null!==(r=null==i||null===(o=i.vgs)||void 0===o||null===(a=o.vaultNames)||void 0===a?void 0:a.standard)&&void 0!==r?r:"tntmupn9ras";return"members"===u?s:l};window.VGSCollect=window.VGSCollect||{};var O=function(e){var n=j("members"),t=(0,f.useState)(btoa((Math.random()*Math.random()*Date.now()).toString()).replace(/=/gi,"")),r=(0,u.Z)(t,1)[0],i=(0,f.useState)(!1),l=(0,u.Z)(i,2),c=l[0],p=l[1],m=(0,f.useRef)(null);(0,f.useEffect)((function(){null===w&&(w=(0,a.Z)(s().mark((function e(){return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,d.Z.loadScript("https://js.verygoodvault.com/vgs-show/2.0.2/show.js","vgs-show");case 3:b=window.VGSShow.create(n,(function(e){})).setEnvironment("live"),e.next=9;break;case 6:e.prev=6,e.t0=e.catch(0),console.error("Unable to load vgs-show "+e.t0.message);case 9:case"end":return e.stop()}}),e,null,[[0,6]])})))())}),[]);var y=function(){var n=(0,a.Z)(s().mark((function n(){var t;return s().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,(0,v.v)();case 2:t=n.sent,b&&null!=m&&m.current&&(m.current.classList.add(r),p(!0),t.currentAuthenticatedUser().then((function(n){var t=n.signInUserSession.idToken.jwtToken,a=b.request({name:e.name,method:"POST",path:"/members/vgs-auth",payload:(0,o.Z)({},e.name,"".concat(e.value)),headers:{Authorization:t},serializers:[b.SERIALIZERS.replace("(\\d{4})(\\d{4})(\\d{4})(\\d{4})","$1 $2 $3 $4")],htmlWrapper:"text",jsonPathSelector:"".concat(e.name)});a.on("revealSuccess",(function(){p(!1)})),a.on("revealFail",(function(){p(!1)})),m.current&&(m.current.innerHTML=""),a.render(".".concat(r),e.styles)})));case 4:case"end":return n.stop()}}),n)})));return function(){return n.apply(this,arguments)}}();return(0,f.useEffect)((function(){y()}),[b,m,e.name,e.value]),{targetRef:m,isLoading:c}},Z=function(e){var n=j(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"standard"),t=e.map((function(){return(0,f.useRef)(null)})),o=function(e){return g(g({name:e.name,type:e.type},e.vgsProps),{},{disabled:e.vgsProps.disabled||void 0})},i=(0,f.useState)(!1),l=(0,u.Z)(i,2),v=l[0],p=l[1],y=(0,f.useState)(null),h=(0,u.Z)(y,2),b=h[0],w=h[1],O=(0,f.useState)(e.map((function(e){return{isFocused:!1,isValid:!1,name:e.name,label:e.label,type:e.type,vgsInput:null}}))),Z=(0,u.Z)(O,2),P=Z[0],k=Z[1];return(0,f.useEffect)((function(){var e=!1;return null===S?S=(0,a.Z)(s().mark((function n(){return s().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,d.Z.loadScript("https://js.verygoodvault.com/vgs-collect/2.18.1/vgs-collect.js","vgs-collect");case 2:e||p(!0);case 3:case"end":return n.stop()}}),n)})))():S.then((function(){e||p(!0)})),function(){e=!0}}),[]),(0,f.useEffect)((function(){var a,u=m(t);try{for(u.s();!(a=u.n()).done;){var i=a.value;if(null==i||!i.current)return}}catch(e){u.e(e)}finally{u.f()}if(v&&!b){var s=window.VGSCollect.create(n,"live",(function(e){k((function(n){var t,o=(0,r.Z)(n),a=m(o);try{for(a.s();!(t=a.n()).done;){var u=t.value,i=e[u.name];i&&(u.isFocused=i.isFocused,u.isValid=i.isEmpty?null:i.isValid,"card-number"===u.type&&(u.cardType=i.cardType))}}catch(e){a.e(e)}finally{a.f()}return o}))}));w(s),k((function(n){for(var a=(0,r.Z)(n),u=0;u<a.length;u++){var i=a[u],l=e[u];i.vgsInput=s.field(t[u].current,o(l))}return a}))}}),[v,b,t]),{fields:e.map((function(n,r){return{ref:t[r],state:P[r],getClasses:function(n){return function(n,t){var r,o=P[n],a=e[n];return o?c()("c-input","c-input--vgs",t,{"--selected":o.isFocused,"--success":null!==o.isValid&&o.isValid,"--error":null!==o.isValid&&!o.isValid,"--disabled":!(null==a||null===(r=a.vgsProps)||void 0===r||!r.disabled)}):""}(r,n)}}})),triggerFieldUpdate:function(){var n,r=m(t);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(null==a||!a.current)return}}catch(e){r.e(e)}finally{r.f()}if(b)for(var u=0;u<P.length;u++){var i,s,l=P[u],c=e[u];l.vgsInput&&(null===(i=(s=l.vgsInput).update)||void 0===i||i.call(s,o(c)))}},vgsForm:b}}}}]);
@@ -1,22 +0,0 @@
1
- import React, { ReactNode } from 'react';
2
- export interface ShadowDomBottomSheetProps {
3
- open: boolean;
4
- children: ReactNode;
5
- onDismiss?: () => void;
6
- header?: ReactNode | false;
7
- footer?: ReactNode;
8
- className?: string;
9
- style?: React.CSSProperties;
10
- snapPoints?: (props: any) => number[] | number;
11
- defaultSnap?: number | ((props: any) => number);
12
- blocking?: boolean;
13
- }
14
- /**
15
- * A Shadow DOM-compatible bottom sheet that renders via RoomstayPortal
16
- * instead of portaling to document.body (which react-spring-bottom-sheet does).
17
- *
18
- * Provides slide-up animation, backdrop, dismiss on outside click,
19
- * and basic snap point support (min-height vs full-height).
20
- */
21
- declare const ShadowDomBottomSheet: React.FC<ShadowDomBottomSheetProps>;
22
- export default ShadowDomBottomSheet;
@@ -1,131 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const classnames_1 = __importDefault(require("classnames"));
40
- const react_1 = __importStar(require("react"));
41
- const Portal_1 = require("../../Portal/Portal");
42
- /**
43
- * A Shadow DOM-compatible bottom sheet that renders via RoomstayPortal
44
- * instead of portaling to document.body (which react-spring-bottom-sheet does).
45
- *
46
- * Provides slide-up animation, backdrop, dismiss on outside click,
47
- * and basic snap point support (min-height vs full-height).
48
- */
49
- const ShadowDomBottomSheet = ({ open, children, onDismiss, header, footer, className, style, snapPoints, blocking = true }) => {
50
- const [visible, setVisible] = (0, react_1.useState)(false);
51
- const [animating, setAnimating] = (0, react_1.useState)(false);
52
- const sheetRef = (0, react_1.useRef)(null);
53
- const contentRef = (0, react_1.useRef)(null);
54
- // Determine target height from snapPoints
55
- const getTargetHeight = (0, react_1.useCallback)(() => {
56
- if (!snapPoints)
57
- return 'auto';
58
- const maxHeight = window.innerHeight;
59
- const result = snapPoints({ maxHeight, minHeight: 0 });
60
- const points = Array.isArray(result) ? result : [result];
61
- const maxSnap = Math.max(...points);
62
- if (maxSnap >= maxHeight * 0.9)
63
- return '100vh';
64
- return 'auto';
65
- }, [snapPoints]);
66
- (0, react_1.useEffect)(() => {
67
- if (open) {
68
- setVisible(true);
69
- // Trigger animation on next frame
70
- requestAnimationFrame(() => {
71
- requestAnimationFrame(() => setAnimating(true));
72
- });
73
- }
74
- else {
75
- setAnimating(false);
76
- const timer = setTimeout(() => setVisible(false), 300);
77
- return () => clearTimeout(timer);
78
- }
79
- }, [open]);
80
- // Close on Escape
81
- (0, react_1.useEffect)(() => {
82
- if (!open)
83
- return;
84
- const handleKeyDown = (e) => {
85
- if (e.key === 'Escape')
86
- onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
87
- };
88
- document.addEventListener('keydown', handleKeyDown);
89
- return () => document.removeEventListener('keydown', handleKeyDown);
90
- }, [open, onDismiss]);
91
- const handleBackdropClick = (0, react_1.useCallback)(() => {
92
- if (blocking)
93
- onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
94
- }, [blocking, onDismiss]);
95
- if (!visible)
96
- return null;
97
- const targetHeight = getTargetHeight();
98
- const isFullHeight = targetHeight === '100vh';
99
- return (react_1.default.createElement(Portal_1.RoomstayPortal, { target: document.body },
100
- react_1.default.createElement("div", { style: {
101
- position: 'fixed',
102
- inset: 0,
103
- zIndex: 999,
104
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
105
- opacity: animating ? 1 : 0,
106
- transition: 'opacity 300ms ease',
107
- pointerEvents: blocking ? 'auto' : 'none',
108
- }, onClick: handleBackdropClick }),
109
- react_1.default.createElement("div", { ref: sheetRef, className: (0, classnames_1.default)(className), style: Object.assign({ position: 'fixed', bottom: 0, left: 0, right: 0, zIndex: 1000, backgroundColor: 'white', borderRadius: isFullHeight ? '0' : '16px 16px 0 0', boxShadow: '0 -4px 20px rgba(0, 0, 0, 0.15)', transform: animating ? 'translateY(0)' : 'translateY(100%)', transition: 'transform 300ms cubic-bezier(0.32, 0.72, 0, 1)', maxHeight: isFullHeight ? '100vh' : '85vh', display: 'flex', flexDirection: 'column' }, style) },
110
- header !== false && (react_1.default.createElement("div", { style: {
111
- display: 'flex',
112
- justifyContent: 'center',
113
- padding: '8px 0 0',
114
- flexShrink: 0,
115
- } },
116
- react_1.default.createElement("div", { style: {
117
- width: 36,
118
- height: 4,
119
- borderRadius: 2,
120
- backgroundColor: '#dfe1e5',
121
- } }))),
122
- header && header !== false && react_1.default.createElement("div", { style: { flexShrink: 0 } }, header),
123
- react_1.default.createElement("div", { ref: contentRef, style: {
124
- flex: 1,
125
- overflowY: 'auto',
126
- WebkitOverflowScrolling: 'touch',
127
- } }, children),
128
- footer && react_1.default.createElement("div", { style: { flexShrink: 0 } }, footer))));
129
- };
130
- exports.default = ShadowDomBottomSheet;
131
- //# sourceMappingURL=ShadowDomBottomSheet.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShadowDomBottomSheet.js","sourceRoot":"/","sources":["src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.tsx"],"names":[],"mappings":"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","sourcesContent":["import classNames from 'classnames';\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { RoomstayPortal } from '../../Portal/Portal';\n\nexport interface ShadowDomBottomSheetProps {\n open: boolean;\n children: ReactNode;\n onDismiss?: () => void;\n header?: ReactNode | false;\n footer?: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n snapPoints?: (props: any) => number[] | number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultSnap?: number | ((props: any) => number);\n blocking?: boolean;\n}\n\n/**\n * A Shadow DOM-compatible bottom sheet that renders via RoomstayPortal\n * instead of portaling to document.body (which react-spring-bottom-sheet does).\n *\n * Provides slide-up animation, backdrop, dismiss on outside click,\n * and basic snap point support (min-height vs full-height).\n */\nconst ShadowDomBottomSheet: React.FC<ShadowDomBottomSheetProps> = ({ open, children, onDismiss, header, footer, className, style, snapPoints, blocking = true }) => {\n const [visible, setVisible] = useState(false);\n const [animating, setAnimating] = useState(false);\n const sheetRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Determine target height from snapPoints\n const getTargetHeight = useCallback((): string => {\n if (!snapPoints) return 'auto';\n\n const maxHeight = window.innerHeight;\n const result = snapPoints({ maxHeight, minHeight: 0 });\n const points = Array.isArray(result) ? result : [result];\n const maxSnap = Math.max(...points);\n\n if (maxSnap >= maxHeight * 0.9) return '100vh';\n return 'auto';\n }, [snapPoints]);\n\n useEffect(() => {\n if (open) {\n setVisible(true);\n // Trigger animation on next frame\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setAnimating(true));\n });\n } else {\n setAnimating(false);\n const timer = setTimeout(() => setVisible(false), 300);\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onDismiss?.();\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [open, onDismiss]);\n\n const handleBackdropClick = useCallback(() => {\n if (blocking) onDismiss?.();\n }, [blocking, onDismiss]);\n\n if (!visible) return null;\n\n const targetHeight = getTargetHeight();\n const isFullHeight = targetHeight === '100vh';\n\n return (\n <RoomstayPortal target={document.body}>\n {/* Backdrop */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n opacity: animating ? 1 : 0,\n transition: 'opacity 300ms ease',\n pointerEvents: blocking ? 'auto' : 'none',\n }}\n onClick={handleBackdropClick}\n />\n\n {/* Sheet */}\n <div\n ref={sheetRef}\n className={classNames(className)}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 1000,\n backgroundColor: 'white',\n borderRadius: isFullHeight ? '0' : '16px 16px 0 0',\n boxShadow: '0 -4px 20px rgba(0, 0, 0, 0.15)',\n transform: animating ? 'translateY(0)' : 'translateY(100%)',\n transition: 'transform 300ms cubic-bezier(0.32, 0.72, 0, 1)',\n maxHeight: isFullHeight ? '100vh' : '85vh',\n display: 'flex',\n flexDirection: 'column',\n ...style,\n }}\n >\n {/* Drag handle */}\n {header !== false && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '8px 0 0',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: 36,\n height: 4,\n borderRadius: 2,\n backgroundColor: '#dfe1e5',\n }}\n />\n </div>\n )}\n\n {/* Header */}\n {header && header !== false && <div style={{ flexShrink: 0 }}>{header}</div>}\n\n {/* Scrollable content */}\n <div\n ref={contentRef}\n style={{\n flex: 1,\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n }}\n >\n {children}\n </div>\n\n {/* Footer */}\n {footer && <div style={{ flexShrink: 0 }}>{footer}</div>}\n </div>\n </RoomstayPortal>\n );\n};\n\nexport default ShadowDomBottomSheet;\n"]}
@@ -1,10 +0,0 @@
1
- export interface ShadowDomContextType {
2
- /** Whether Shadow DOM is active */
3
- isShadowDom: boolean;
4
- /** The shadow root element, or null if not in Shadow DOM */
5
- shadowRoot: ShadowRoot | null;
6
- /** The portal target: shadow root container if in Shadow DOM, or document.body */
7
- portalTarget: HTMLElement;
8
- }
9
- export declare const ShadowDomContext: import("react").Context<ShadowDomContextType>;
10
- export declare const useShadowDom: () => ShadowDomContextType;
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useShadowDom = exports.ShadowDomContext = void 0;
4
- const react_1 = require("react");
5
- exports.ShadowDomContext = (0, react_1.createContext)({
6
- isShadowDom: false,
7
- shadowRoot: null,
8
- portalTarget: document.body,
9
- });
10
- const useShadowDom = () => (0, react_1.useContext)(exports.ShadowDomContext);
11
- exports.useShadowDom = useShadowDom;
12
- //# sourceMappingURL=ShadowDomContext.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShadowDomContext.js","sourceRoot":"/","sources":["src/contexts/ShadowDomContext/ShadowDomContext.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAWrC,QAAA,gBAAgB,GAAG,IAAA,qBAAa,EAAuB;IAChE,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,QAAQ,CAAC,IAAI;CAC9B,CAAC,CAAC;AAEI,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAA,kBAAU,EAAC,wBAAgB,CAAC,CAAC;AAAlD,QAAA,YAAY,gBAAsC","sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface ShadowDomContextType {\n /** Whether Shadow DOM is active */\n isShadowDom: boolean;\n /** The shadow root element, or null if not in Shadow DOM */\n shadowRoot: ShadowRoot | null;\n /** The portal target: shadow root container if in Shadow DOM, or document.body */\n portalTarget: HTMLElement;\n}\n\nexport const ShadowDomContext = createContext<ShadowDomContextType>({\n isShadowDom: false,\n shadowRoot: null,\n portalTarget: document.body,\n});\n\nexport const useShadowDom = () => useContext(ShadowDomContext);\n"]}
@@ -1,8 +0,0 @@
1
- import React, { ReactNode } from 'react';
2
- import { ShadowDomContextType } from './ShadowDomContext';
3
- interface ShadowDomContextProviderProps {
4
- children: ReactNode;
5
- value: ShadowDomContextType;
6
- }
7
- export declare const ShadowDomContextProvider: ({ children, value }: ShadowDomContextProviderProps) => React.JSX.Element;
8
- export {};
@@ -1,13 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ShadowDomContextProvider = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const ShadowDomContext_1 = require("./ShadowDomContext");
9
- const ShadowDomContextProvider = ({ children, value }) => {
10
- return react_1.default.createElement(ShadowDomContext_1.ShadowDomContext.Provider, { value: value }, children);
11
- };
12
- exports.ShadowDomContextProvider = ShadowDomContextProvider;
13
- //# sourceMappingURL=ShadowDomContextProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShadowDomContextProvider.js","sourceRoot":"/","sources":["src/contexts/ShadowDomContext/ShadowDomContextProvider.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyC;AAEzC,yDAA4E;AAOrE,MAAM,wBAAwB,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAiC,EAAE,EAAE;IAC3F,OAAO,8BAAC,mCAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,CAA6B,CAAC;AAC3F,CAAC,CAAC;AAFW,QAAA,wBAAwB,4BAEnC","sourcesContent":["import React, { ReactNode } from 'react';\n\nimport { ShadowDomContext, ShadowDomContextType } from './ShadowDomContext';\n\ninterface ShadowDomContextProviderProps {\n children: ReactNode;\n value: ShadowDomContextType;\n}\n\nexport const ShadowDomContextProvider = ({ children, value }: ShadowDomContextProviderProps) => {\n return <ShadowDomContext.Provider value={value}>{children}</ShadowDomContext.Provider>;\n};\n"]}
@@ -1,21 +0,0 @@
1
- /**
2
- * Manages Shadow DOM setup for a booking engine instance.
3
- *
4
- * Creates a shadow root on the host element with:
5
- * - An inner container div (.roomstay-booking-container) for React rendering
6
- * - Style injection via StyleInjector (all cached + future styles are duplicated here)
7
- */
8
- export declare class ShadowDomManager {
9
- private shadowRoot;
10
- private innerContainer;
11
- private unregisterStyles;
12
- constructor(hostElement: HTMLElement);
13
- /** The shadow root */
14
- get root(): ShadowRoot;
15
- /** The inner container div — use as React render target and RoomstayThemeEngine.EngineContainer */
16
- get container(): HTMLDivElement;
17
- /** Inject a one-off style into the shadow root */
18
- injectStyle(cssText: string, id?: string): HTMLStyleElement;
19
- /** Clean up — unregister from StyleInjector */
20
- destroy(): void;
21
- }
@@ -1,55 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ShadowDomManager = void 0;
4
- const StyleInjector_1 = require("./StyleInjector");
5
- /**
6
- * Manages Shadow DOM setup for a booking engine instance.
7
- *
8
- * Creates a shadow root on the host element with:
9
- * - An inner container div (.roomstay-booking-container) for React rendering
10
- * - Style injection via StyleInjector (all cached + future styles are duplicated here)
11
- */
12
- class ShadowDomManager {
13
- constructor(hostElement) {
14
- this.unregisterStyles = null;
15
- this.shadowRoot = hostElement.attachShadow({ mode: 'open' });
16
- // Create the inner container for React rendering
17
- this.innerContainer = document.createElement('div');
18
- this.innerContainer.classList.add('roomstay-booking-container');
19
- this.shadowRoot.appendChild(this.innerContainer);
20
- // Register this shadow root to receive all style injections
21
- this.unregisterStyles = StyleInjector_1.StyleInjector.registerShadowRoot(this.shadowRoot);
22
- }
23
- /** The shadow root */
24
- get root() {
25
- return this.shadowRoot;
26
- }
27
- /** The inner container div — use as React render target and RoomstayThemeEngine.EngineContainer */
28
- get container() {
29
- return this.innerContainer;
30
- }
31
- /** Inject a one-off style into the shadow root */
32
- injectStyle(cssText, id) {
33
- if (id) {
34
- const existing = this.shadowRoot.querySelector(`style[data-rs-id="${id}"]`);
35
- if (existing) {
36
- existing.textContent = cssText;
37
- return existing;
38
- }
39
- }
40
- const style = document.createElement('style');
41
- if (id)
42
- style.setAttribute('data-rs-id', id);
43
- style.textContent = cssText;
44
- this.shadowRoot.appendChild(style);
45
- return style;
46
- }
47
- /** Clean up — unregister from StyleInjector */
48
- destroy() {
49
- var _a;
50
- (_a = this.unregisterStyles) === null || _a === void 0 ? void 0 : _a.call(this);
51
- this.unregisterStyles = null;
52
- }
53
- }
54
- exports.ShadowDomManager = ShadowDomManager;
55
- //# sourceMappingURL=ShadowDomManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShadowDomManager.js","sourceRoot":"/","sources":["src/providers/ShadowDomManager.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAEhD;;;;;;GAMG;AACH,MAAa,gBAAgB;IAKzB,YAAY,WAAwB;QAF5B,qBAAgB,GAAwB,IAAI,CAAC;QAGjD,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7D,iDAAiD;QACjD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEjD,4DAA4D;QAC5D,IAAI,CAAC,gBAAgB,GAAG,6BAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9E,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,mGAAmG;IACnG,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,kDAAkD;IAClD,WAAW,CAAC,OAAe,EAAE,EAAW;QACpC,IAAI,EAAE,EAAE,CAAC;YACL,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAqB,CAAC;YAChG,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC/B,OAAO,QAAQ,CAAC;YACpB,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,EAAE;YAAE,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,+CAA+C;IAC/C,OAAO;;QACH,MAAA,IAAI,CAAC,gBAAgB,oDAAI,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ;AAhDD,4CAgDC","sourcesContent":["import { StyleInjector } from './StyleInjector';\n\n/**\n * Manages Shadow DOM setup for a booking engine instance.\n *\n * Creates a shadow root on the host element with:\n * - An inner container div (.roomstay-booking-container) for React rendering\n * - Style injection via StyleInjector (all cached + future styles are duplicated here)\n */\nexport class ShadowDomManager {\n private shadowRoot: ShadowRoot;\n private innerContainer: HTMLDivElement;\n private unregisterStyles: (() => void) | null = null;\n\n constructor(hostElement: HTMLElement) {\n this.shadowRoot = hostElement.attachShadow({ mode: 'open' });\n\n // Create the inner container for React rendering\n this.innerContainer = document.createElement('div');\n this.innerContainer.classList.add('roomstay-booking-container');\n this.shadowRoot.appendChild(this.innerContainer);\n\n // Register this shadow root to receive all style injections\n this.unregisterStyles = StyleInjector.registerShadowRoot(this.shadowRoot);\n }\n\n /** The shadow root */\n get root(): ShadowRoot {\n return this.shadowRoot;\n }\n\n /** The inner container div — use as React render target and RoomstayThemeEngine.EngineContainer */\n get container(): HTMLDivElement {\n return this.innerContainer;\n }\n\n /** Inject a one-off style into the shadow root */\n injectStyle(cssText: string, id?: string): HTMLStyleElement {\n if (id) {\n const existing = this.shadowRoot.querySelector(`style[data-rs-id=\"${id}\"]`) as HTMLStyleElement;\n if (existing) {\n existing.textContent = cssText;\n return existing;\n }\n }\n const style = document.createElement('style');\n if (id) style.setAttribute('data-rs-id', id);\n style.textContent = cssText;\n this.shadowRoot.appendChild(style);\n return style;\n }\n\n /** Clean up — unregister from StyleInjector */\n destroy(): void {\n this.unregisterStyles?.();\n this.unregisterStyles = null;\n }\n}\n"]}
@@ -1,42 +0,0 @@
1
- /**
2
- * Global registry for Shadow DOM style injection.
3
- *
4
- * When style-loader injects a <style> tag, it calls `insertStyle()` which:
5
- * 1. Appends the style to document.head (for light DOM engines)
6
- * 2. Observes the element for content changes (style-loader sets content AFTER insert() returns)
7
- * 3. Clones it into every registered shadow root once content is available
8
- *
9
- * When a shadow root registers, all existing <style> tags in document.head
10
- * (that have our data attribute) are cloned into it — by that time, all styles
11
- * already have their content set by style-loader.
12
- *
13
- * Must be on `window.__roomstayStyleInjector` so style-loader's insert function can access it.
14
- */
15
- declare class StyleInjectorClass {
16
- private shadowRoots;
17
- private managedStyleIds;
18
- private styleIdCounter;
19
- /**
20
- * Register a shadow root to receive style injections.
21
- * All existing managed styles in document.head are cloned into the shadow root.
22
- * Returns an unregister function.
23
- */
24
- registerShadowRoot(shadowRoot: ShadowRoot): () => void;
25
- /**
26
- * Called by style-loader's custom insert function.
27
- * Appends the style element to document.head, then observes it for content
28
- * changes so we can clone into shadow roots once style-loader sets the CSS.
29
- */
30
- insertStyle(styleElement: HTMLStyleElement): void;
31
- /**
32
- * Watch a style element for content changes. Once content is set,
33
- * clone it into all registered shadow roots.
34
- */
35
- private observeAndClone;
36
- /**
37
- * Clone CSS text into all registered shadow roots.
38
- */
39
- private cloneToShadowRoots;
40
- }
41
- export declare const StyleInjector: StyleInjectorClass;
42
- export {};
@@ -1,118 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StyleInjector = void 0;
4
- /**
5
- * Global registry for Shadow DOM style injection.
6
- *
7
- * When style-loader injects a <style> tag, it calls `insertStyle()` which:
8
- * 1. Appends the style to document.head (for light DOM engines)
9
- * 2. Observes the element for content changes (style-loader sets content AFTER insert() returns)
10
- * 3. Clones it into every registered shadow root once content is available
11
- *
12
- * When a shadow root registers, all existing <style> tags in document.head
13
- * (that have our data attribute) are cloned into it — by that time, all styles
14
- * already have their content set by style-loader.
15
- *
16
- * Must be on `window.__roomstayStyleInjector` so style-loader's insert function can access it.
17
- */
18
- class StyleInjectorClass {
19
- constructor() {
20
- this.shadowRoots = new Set();
21
- this.managedStyleIds = new Set();
22
- this.styleIdCounter = 0;
23
- }
24
- /**
25
- * Register a shadow root to receive style injections.
26
- * All existing managed styles in document.head are cloned into the shadow root.
27
- * Returns an unregister function.
28
- */
29
- registerShadowRoot(shadowRoot) {
30
- this.shadowRoots.add(shadowRoot);
31
- // Copy all existing managed styles from document.head.
32
- // By registration time, style-loader has already set their content.
33
- const existingStyles = document.head.querySelectorAll('style[data-rs-style]');
34
- existingStyles.forEach((styleEl) => {
35
- const cssText = styleEl.textContent || '';
36
- if (cssText) {
37
- const clone = document.createElement('style');
38
- clone.setAttribute('data-rs-style', styleEl.getAttribute('data-rs-style') || '');
39
- clone.textContent = cssText;
40
- shadowRoot.appendChild(clone);
41
- }
42
- });
43
- return () => {
44
- this.shadowRoots.delete(shadowRoot);
45
- };
46
- }
47
- /**
48
- * Called by style-loader's custom insert function.
49
- * Appends the style element to document.head, then observes it for content
50
- * changes so we can clone into shadow roots once style-loader sets the CSS.
51
- */
52
- insertStyle(styleElement) {
53
- const id = `rs-style-${this.styleIdCounter++}`;
54
- styleElement.setAttribute('data-rs-style', id);
55
- this.managedStyleIds.add(id);
56
- // Always inject into document.head for light DOM engines
57
- document.head.appendChild(styleElement);
58
- // style-loader sets content AFTER insert() returns.
59
- // Use MutationObserver to detect when content is set, then clone to shadow roots.
60
- if (this.shadowRoots.size > 0) {
61
- this.observeAndClone(styleElement, id);
62
- }
63
- else {
64
- // No shadow roots yet — still observe in case one registers before
65
- // style-loader sets the content (unlikely but safe)
66
- this.observeAndClone(styleElement, id);
67
- }
68
- }
69
- /**
70
- * Watch a style element for content changes. Once content is set,
71
- * clone it into all registered shadow roots.
72
- */
73
- observeAndClone(styleElement, id) {
74
- // Check if content is already available (e.g. manually created styles)
75
- const immediateContent = styleElement.textContent || '';
76
- if (immediateContent) {
77
- this.cloneToShadowRoots(immediateContent, id);
78
- return;
79
- }
80
- // Observe for childList changes (style-loader adds a text node)
81
- const observer = new MutationObserver(() => {
82
- const cssText = styleElement.textContent || '';
83
- if (cssText) {
84
- observer.disconnect();
85
- this.cloneToShadowRoots(cssText, id);
86
- }
87
- });
88
- observer.observe(styleElement, { childList: true, characterData: true, subtree: true });
89
- // Safety fallback: if MutationObserver doesn't fire (e.g. style-loader uses
90
- // element.textContent = ... which may not trigger characterData), use a microtask
91
- Promise.resolve().then(() => {
92
- const cssText = styleElement.textContent || '';
93
- if (cssText) {
94
- observer.disconnect();
95
- this.cloneToShadowRoots(cssText, id);
96
- }
97
- });
98
- }
99
- /**
100
- * Clone CSS text into all registered shadow roots.
101
- */
102
- cloneToShadowRoots(cssText, id) {
103
- this.shadowRoots.forEach((shadowRoot) => {
104
- // Avoid duplicates — check if this ID already exists in the shadow root
105
- if (shadowRoot.querySelector(`style[data-rs-style="${id}"]`)) {
106
- return;
107
- }
108
- const clone = document.createElement('style');
109
- clone.setAttribute('data-rs-style', id);
110
- clone.textContent = cssText;
111
- shadowRoot.appendChild(clone);
112
- });
113
- }
114
- }
115
- // Singleton on window so style-loader's insert function can access it
116
- window.__roomstayStyleInjector = window.__roomstayStyleInjector || new StyleInjectorClass();
117
- exports.StyleInjector = window.__roomstayStyleInjector;
118
- //# sourceMappingURL=StyleInjector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StyleInjector.js","sourceRoot":"/","sources":["src/providers/StyleInjector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global registry for Shadow DOM style injection.\n *\n * When style-loader injects a <style> tag, it calls `insertStyle()` which:\n * 1. Appends the style to document.head (for light DOM engines)\n * 2. Observes the element for content changes (style-loader sets content AFTER insert() returns)\n * 3. Clones it into every registered shadow root once content is available\n *\n * When a shadow root registers, all existing <style> tags in document.head\n * (that have our data attribute) are cloned into it — by that time, all styles\n * already have their content set by style-loader.\n *\n * Must be on `window.__roomstayStyleInjector` so style-loader's insert function can access it.\n */\nclass StyleInjectorClass {\n private shadowRoots: Set<ShadowRoot> = new Set();\n private managedStyleIds: Set<string> = new Set();\n private styleIdCounter = 0;\n\n /**\n * Register a shadow root to receive style injections.\n * All existing managed styles in document.head are cloned into the shadow root.\n * Returns an unregister function.\n */\n registerShadowRoot(shadowRoot: ShadowRoot): () => void {\n this.shadowRoots.add(shadowRoot);\n\n // Copy all existing managed styles from document.head.\n // By registration time, style-loader has already set their content.\n const existingStyles = document.head.querySelectorAll('style[data-rs-style]');\n existingStyles.forEach((styleEl) => {\n const cssText = styleEl.textContent || '';\n if (cssText) {\n const clone = document.createElement('style');\n clone.setAttribute('data-rs-style', styleEl.getAttribute('data-rs-style') || '');\n clone.textContent = cssText;\n shadowRoot.appendChild(clone);\n }\n });\n\n return () => {\n this.shadowRoots.delete(shadowRoot);\n };\n }\n\n /**\n * Called by style-loader's custom insert function.\n * Appends the style element to document.head, then observes it for content\n * changes so we can clone into shadow roots once style-loader sets the CSS.\n */\n insertStyle(styleElement: HTMLStyleElement): void {\n const id = `rs-style-${this.styleIdCounter++}`;\n styleElement.setAttribute('data-rs-style', id);\n this.managedStyleIds.add(id);\n\n // Always inject into document.head for light DOM engines\n document.head.appendChild(styleElement);\n\n // style-loader sets content AFTER insert() returns.\n // Use MutationObserver to detect when content is set, then clone to shadow roots.\n if (this.shadowRoots.size > 0) {\n this.observeAndClone(styleElement, id);\n } else {\n // No shadow roots yet — still observe in case one registers before\n // style-loader sets the content (unlikely but safe)\n this.observeAndClone(styleElement, id);\n }\n }\n\n /**\n * Watch a style element for content changes. Once content is set,\n * clone it into all registered shadow roots.\n */\n private observeAndClone(styleElement: HTMLStyleElement, id: string): void {\n // Check if content is already available (e.g. manually created styles)\n const immediateContent = styleElement.textContent || '';\n if (immediateContent) {\n this.cloneToShadowRoots(immediateContent, id);\n return;\n }\n\n // Observe for childList changes (style-loader adds a text node)\n const observer = new MutationObserver(() => {\n const cssText = styleElement.textContent || '';\n if (cssText) {\n observer.disconnect();\n this.cloneToShadowRoots(cssText, id);\n }\n });\n\n observer.observe(styleElement, { childList: true, characterData: true, subtree: true });\n\n // Safety fallback: if MutationObserver doesn't fire (e.g. style-loader uses\n // element.textContent = ... which may not trigger characterData), use a microtask\n Promise.resolve().then(() => {\n const cssText = styleElement.textContent || '';\n if (cssText) {\n observer.disconnect();\n this.cloneToShadowRoots(cssText, id);\n }\n });\n }\n\n /**\n * Clone CSS text into all registered shadow roots.\n */\n private cloneToShadowRoots(cssText: string, id: string): void {\n this.shadowRoots.forEach((shadowRoot) => {\n // Avoid duplicates — check if this ID already exists in the shadow root\n if (shadowRoot.querySelector(`style[data-rs-style=\"${id}\"]`)) {\n return;\n }\n const clone = document.createElement('style');\n clone.setAttribute('data-rs-style', id);\n clone.textContent = cssText;\n shadowRoot.appendChild(clone);\n });\n }\n}\n\n// Singleton on window so style-loader's insert function can access it\n(window as any).__roomstayStyleInjector = (window as any).__roomstayStyleInjector || new StyleInjectorClass();\nexport const StyleInjector: StyleInjectorClass = (window as any).__roomstayStyleInjector;\n"]}