@elliemae/pui-app-sdk 5.40.3 → 5.40.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/{6879.3434f1e9.iframe.bundle.js → 1080.92f6b67a.iframe.bundle.js} +480 -480
- package/demo/1080.92f6b67a.iframe.bundle.js.br +0 -0
- package/demo/1080.92f6b67a.iframe.bundle.js.gz +0 -0
- package/demo/docs/{6879.3434f1e9.iframe.bundle.js → 1080.92f6b67a.iframe.bundle.js} +480 -480
- package/demo/docs/1080.92f6b67a.iframe.bundle.js.br +0 -0
- package/demo/docs/1080.92f6b67a.iframe.bundle.js.gz +0 -0
- package/demo/docs/iframe.html +1 -1
- package/demo/docs/index.html +1 -1
- package/demo/docs/{main.f4b9fb997236ae69d894.manager.bundle.js → main.cfd2e2085f77fe383f8d.manager.bundle.js} +1 -1
- package/demo/docs/{main.f4b9fb997236ae69d894.manager.bundle.js.br → main.cfd2e2085f77fe383f8d.manager.bundle.js.br} +0 -0
- package/demo/docs/{main.f4b9fb997236ae69d894.manager.bundle.js.gz → main.cfd2e2085f77fe383f8d.manager.bundle.js.gz} +0 -0
- package/demo/docs/main.f92b110f.iframe.bundle.js +5 -0
- package/demo/docs/main.f92b110f.iframe.bundle.js.br +0 -0
- package/demo/docs/main.f92b110f.iframe.bundle.js.gz +0 -0
- package/demo/docs/project.json +1 -1
- package/demo/iframe.html +1 -1
- package/demo/index.html +1 -1
- package/demo/{main.f4b9fb997236ae69d894.manager.bundle.js → main.cfd2e2085f77fe383f8d.manager.bundle.js} +1 -1
- package/demo/{main.f4b9fb997236ae69d894.manager.bundle.js.br → main.cfd2e2085f77fe383f8d.manager.bundle.js.br} +0 -0
- package/demo/{main.f4b9fb997236ae69d894.manager.bundle.js.gz → main.cfd2e2085f77fe383f8d.manager.bundle.js.gz} +0 -0
- package/demo/main.f92b110f.iframe.bundle.js +5 -0
- package/demo/main.f92b110f.iframe.bundle.js.br +0 -0
- package/demo/main.f92b110f.iframe.bundle.js.gz +0 -0
- package/demo/project.json +1 -1
- package/dist/cjs/utils/micro-frontend/guest-host-context.js +47 -0
- package/dist/cjs/utils/micro-frontend/guest.js +4 -3
- package/dist/cjs/utils/micro-frontend/host.js +4 -3
- package/dist/cjs/utils/micro-frontend/index.js +4 -1
- package/dist/cjs/utils/micro-frontend/module-so.js +5 -1
- package/dist/cjs/utils/micro-frontend/tests/guest-test-utils.js +27 -0
- package/dist/cjs/view/guest-microapp.js +30 -8
- package/dist/cjs/view/tests/__snapshots__/micro-iframe-app.test.tsx.snap +2 -2
- package/dist/esm/utils/micro-frontend/guest-host-context.js +27 -0
- package/dist/esm/utils/micro-frontend/guest.js +4 -3
- package/dist/esm/utils/micro-frontend/host.js +4 -3
- package/dist/esm/utils/micro-frontend/index.js +4 -1
- package/dist/esm/utils/micro-frontend/module-so.js +5 -1
- package/dist/esm/utils/micro-frontend/tests/guest-test-utils.js +7 -0
- package/dist/esm/view/guest-microapp.js +33 -8
- package/dist/esm/view/tests/__snapshots__/micro-iframe-app.test.tsx.snap +2 -2
- package/dist/types/lib/utils/micro-frontend/guest-host-context.d.ts +40 -0
- package/dist/types/lib/utils/micro-frontend/guest.d.ts +2 -1
- package/dist/types/lib/utils/micro-frontend/host.d.ts +2 -1
- package/dist/types/lib/utils/micro-frontend/module-so.d.ts +7 -5
- package/dist/types/lib/utils/micro-frontend/tests/guest-host-context.test.d.ts +1 -0
- package/dist/types/lib/utils/micro-frontend/tests/guest-test-utils.d.ts +2 -0
- package/dist/types/lib/view/guest-microapp.d.ts +12 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/build/docs/404.html +0 -16
- package/build/docs/api/classes/Analytics/index.html +0 -270
- package/build/docs/api/classes/CMicroAppGuest/index.html +0 -261
- package/build/docs/api/classes/CMicroAppHost/index.html +0 -346
- package/build/docs/api/classes/ErrorBoundary/index.html +0 -354
- package/build/docs/api/classes/GuestModule/index.html +0 -148
- package/build/docs/api/functions/AppRoot/index.html +0 -27
- package/build/docs/api/functions/Autocomplete/index.html +0 -22
- package/build/docs/api/functions/CheckBox/index.html +0 -22
- package/build/docs/api/functions/ComboBox/index.html +0 -27
- package/build/docs/api/functions/ComboBoxV3/index.html +0 -22
- package/build/docs/api/functions/ConnectForm/index.html +0 -22
- package/build/docs/api/functions/DateInput/index.html +0 -22
- package/build/docs/api/functions/DatePicker/index.html +0 -27
- package/build/docs/api/functions/DateRangePicker/index.html +0 -22
- package/build/docs/api/functions/DateTimePicker/index.html +0 -22
- package/build/docs/api/functions/Form/index.html +0 -34
- package/build/docs/api/functions/FormItemLayout/index.html +0 -22
- package/build/docs/api/functions/FormLayoutBlockItem/index.html +0 -22
- package/build/docs/api/functions/FormSubmitButton/index.html +0 -22
- package/build/docs/api/functions/InputMask/index.html +0 -22
- package/build/docs/api/functions/InputText/index.html +0 -22
- package/build/docs/api/functions/LargeTextBox/index.html +0 -22
- package/build/docs/api/functions/MaskedInputText/index.html +0 -22
- package/build/docs/api/functions/Page/index.html +0 -22
- package/build/docs/api/functions/Radio/index.html +0 -22
- package/build/docs/api/functions/RadioGroup/index.html +0 -22
- package/build/docs/api/functions/RegisterService/index.html +0 -27
- package/build/docs/api/functions/RenderWithStateAddOns/index.html +0 -22
- package/build/docs/api/functions/RequireAuth/index.html +0 -28
- package/build/docs/api/functions/SessionTimeout/index.html +0 -19
- package/build/docs/api/functions/TextBox/index.html +0 -27
- package/build/docs/api/functions/Toggle/index.html +0 -22
- package/build/docs/api/functions/authSaga/index.html +0 -19
- package/build/docs/api/functions/authorize/index.html +0 -44
- package/build/docs/api/functions/buildModuleParams/index.html +0 -31
- package/build/docs/api/functions/cleanup/index.html +0 -20
- package/build/docs/api/functions/configureStore/index.html +0 -56
- package/build/docs/api/functions/createGuestModule/index.html +0 -39
- package/build/docs/api/functions/createManager/index.html +0 -41
- package/build/docs/api/functions/enableReactAppForHostIntegration/index.html +0 -22
- package/build/docs/api/functions/fetchHostAppData/index.html +0 -24
- package/build/docs/api/functions/fetchUserSettings/index.html +0 -22
- package/build/docs/api/functions/getApiActionCreator/index.html +0 -30
- package/build/docs/api/functions/getAppConfig/index.html +0 -19
- package/build/docs/api/functions/getAppConfigValue/index.html +0 -35
- package/build/docs/api/functions/getAuthHTTPClient/index.html +0 -38
- package/build/docs/api/functions/getAuthorizationHeader/index.html +0 -23
- package/build/docs/api/functions/getHTTPClient/index.html +0 -36
- package/build/docs/api/functions/getHostAppDataByKey/index.html +0 -27
- package/build/docs/api/functions/getLogger/index.html +0 -19
- package/build/docs/api/functions/getMicroFrontEndAppConfig/index.html +0 -23
- package/build/docs/api/functions/getNavigationLinks/index.html +0 -19
- package/build/docs/api/functions/getRedirectUrl/index.html +0 -19
- package/build/docs/api/functions/getSelectField/index.html +0 -33
- package/build/docs/api/functions/getStore/index.html +0 -23
- package/build/docs/api/functions/initServiceWorker/index.html +0 -22
- package/build/docs/api/functions/isCIBuild/index.html +0 -19
- package/build/docs/api/functions/isProd/index.html +0 -19
- package/build/docs/api/functions/isUserAuthorized/index.html +0 -23
- package/build/docs/api/functions/listenStorageEvents/index.html +0 -19
- package/build/docs/api/functions/loadAppConfig/index.html +0 -30
- package/build/docs/api/functions/loadable/index.html +0 -37
- package/build/docs/api/functions/login/index.html +0 -62
- package/build/docs/api/functions/notifyGuestUnloadComplete/index.html +0 -26
- package/build/docs/api/functions/onAuthorizationFailure/index.html +0 -28
- package/build/docs/api/functions/onGuestUnloadStart/index.html +0 -19
- package/build/docs/api/functions/redactPii/index.html +0 -32
- package/build/docs/api/functions/removeDoubleSlash/index.html +0 -22
- package/build/docs/api/functions/removeStorageEvents/index.html +0 -19
- package/build/docs/api/functions/render/index.html +0 -392
- package/build/docs/api/functions/renderHook/index.html +0 -37
- package/build/docs/api/functions/renderWithHostData/index.html +0 -22
- package/build/docs/api/functions/renderWithRedux/index.html +0 -392
- package/build/docs/api/functions/renderWithRouter/index.html +0 -392
- package/build/docs/api/functions/renderWithRouterRedux/index.html +0 -392
- package/build/docs/api/functions/sdkBaseQuery/index.html +0 -37
- package/build/docs/api/functions/sendBAEvent/index.html +0 -34
- package/build/docs/api/functions/sendMessageToHost/index.html +0 -24
- package/build/docs/api/functions/setAppConfig/index.html +0 -27
- package/build/docs/api/functions/setAppConfigValue/index.html +0 -35
- package/build/docs/api/functions/setHostAppData/index.html +0 -25
- package/build/docs/api/functions/setLoginParams/index.html +0 -29
- package/build/docs/api/functions/subscribeToResetSession/index.html +0 -28
- package/build/docs/api/functions/subscribeToSessionExpiry/index.html +0 -28
- package/build/docs/api/functions/subscribeToSessionExpiryWarning/index.html +0 -28
- package/build/docs/api/functions/trackActivity/index.html +0 -31
- package/build/docs/api/functions/useAppDispatch/index.html +0 -24
- package/build/docs/api/functions/useAppMiddleware/index.html +0 -25
- package/build/docs/api/functions/useInjectQuery/index.html +0 -35
- package/build/docs/api/functions/useInjectReducer/index.html +0 -31
- package/build/docs/api/functions/useInjectSaga/index.html +0 -33
- package/build/docs/api/functions/useInjectSideEffect/index.html +0 -25
- package/build/docs/api/functions/useMediaQueryList/index.html +0 -26
- package/build/docs/api/functions/useStateSelector/index.html +0 -38
- package/build/docs/api/functions/useStateSelectorShallow/index.html +0 -39
- package/build/docs/api/functions/waitFor/index.html +0 -27
- package/build/docs/api/functions/waitForElementToBeRemoved/index.html +0 -27
- package/build/docs/api/functions/withAppDecorator/index.html +0 -26
- package/build/docs/api/index.html +0 -29
- package/build/docs/api/interfaces/AppConfig/index.html +0 -46
- package/build/docs/api/interfaces/GuestProps/index.html +0 -86
- package/build/docs/api/interfaces/UseStateSelectorOptions/index.html +0 -25
- package/build/docs/api/type-aliases/AppDispatch/index.html +0 -17
- package/build/docs/api/type-aliases/AppStore/index.html +0 -17
- package/build/docs/api/type-aliases/Await/index.html +0 -20
- package/build/docs/api/type-aliases/EMUI/index.html +0 -62
- package/build/docs/api/type-aliases/HostOptions/index.html +0 -28
- package/build/docs/api/type-aliases/HostProvidedParams/index.html +0 -33
- package/build/docs/api/type-aliases/ModuleOverrides/index.html +0 -47
- package/build/docs/api/type-aliases/OnHostInitCallback/index.html +0 -22
- package/build/docs/api/type-aliases/OnInitCallback/index.html +0 -22
- package/build/docs/api/type-aliases/OnMountCallback/index.html +0 -22
- package/build/docs/api/type-aliases/OnUnMountCallback/index.html +0 -22
- package/build/docs/api/type-aliases/RootState/index.html +0 -17
- package/build/docs/api/type-aliases/SelectStateFieldFunction/index.html +0 -29
- package/build/docs/api/variables/ErrorToast/index.html +0 -17
- package/build/docs/api/variables/FormPropsContext/index.html +0 -24
- package/build/docs/api/variables/GuestMicroApp/index.html +0 -20
- package/build/docs/api/variables/MASK_PIPES/index.html +0 -17
- package/build/docs/api/variables/MASK_TYPES/index.html +0 -17
- package/build/docs/api/variables/MicroApp/index.html +0 -21
- package/build/docs/api/variables/MicroIFrameApp/index.html +0 -21
- package/build/docs/api/variables/NavigationPrompt/index.html +0 -17
- package/build/docs/api/variables/NavigationPromptActions/index.html +0 -22
- package/build/docs/api/variables/Themes/index.html +0 -22
- package/build/docs/api/variables/VisuallyHidden/index.html +0 -17
- package/build/docs/api/variables/WaitMessage/index.html +0 -17
- package/build/docs/api/variables/act/index.html +0 -20
- package/build/docs/api/variables/ariaLive/index.html +0 -17
- package/build/docs/api/variables/auth/index.html +0 -40
- package/build/docs/api/variables/authReducer/index.html +0 -17
- package/build/docs/api/variables/clearSideEffects/index.html +0 -21
- package/build/docs/api/variables/createSideEffect/index.html +0 -19
- package/build/docs/api/variables/decorators/index.html +0 -222
- package/build/docs/api/variables/endSession/index.html +0 -37
- package/build/docs/api/variables/error/index.html +0 -17
- package/build/docs/api/variables/errorMiddleware/index.html +0 -17
- package/build/docs/api/variables/fireEvent/index.html +0 -17
- package/build/docs/api/variables/globalConstants/index.html +0 -22
- package/build/docs/api/variables/history/index.html +0 -17
- package/build/docs/api/variables/httpClientProps/index.html +0 -17
- package/build/docs/api/variables/logout/index.html +0 -22
- package/build/docs/api/variables/memoryHistory/index.html +0 -17
- package/build/docs/api/variables/removeSideEffect/index.html +0 -20
- package/build/docs/api/variables/resetUserIdleTime/index.html +0 -23
- package/build/docs/api/variables/screen/index.html +0 -17
- package/build/docs/api/variables/startSideEffect/index.html +0 -21
- package/build/docs/api/variables/updateBAEventParameters/index.html +0 -27
- package/build/docs/api/variables/useAppSelector/index.html +0 -21
- package/build/docs/api/variables/waitMessageAction/index.html +0 -43
- package/build/docs/api/variables/within/index.html +0 -17
- package/build/docs/assets/css/styles.0fad824b.css +0 -1
- package/build/docs/assets/js/04ee7372.a9b3e0ad.js +0 -1
- package/build/docs/assets/js/05fd5745.f77a9872.js +0 -1
- package/build/docs/assets/js/075aa584.dde55d25.js +0 -1
- package/build/docs/assets/js/0a1bd0e5.3336afb7.js +0 -1
- package/build/docs/assets/js/0f302db7.690bba2c.js +0 -1
- package/build/docs/assets/js/10c70e6f.3a611c9f.js +0 -1
- package/build/docs/assets/js/110b6cba.2039a4be.js +0 -1
- package/build/docs/assets/js/1126.2b1e83b8.js +0 -1
- package/build/docs/assets/js/1127.ce24a599.js +0 -1
- package/build/docs/assets/js/1154937a.58ab70e0.js +0 -1
- package/build/docs/assets/js/1298.f98e394e.js +0 -1
- package/build/docs/assets/js/14efea89.c724a605.js +0 -1
- package/build/docs/assets/js/15f40f8f.62fbc501.js +0 -1
- package/build/docs/assets/js/1617.443ab77e.js +0 -1
- package/build/docs/assets/js/16427680.5a41da14.js +0 -1
- package/build/docs/assets/js/16fba083.0c978e4b.js +0 -1
- package/build/docs/assets/js/1700.bb38b1b9.js +0 -1
- package/build/docs/assets/js/17896441.87af09c7.js +0 -1
- package/build/docs/assets/js/1a5ba401.bdd09a56.js +0 -1
- package/build/docs/assets/js/1ad86f56.5c4d3ed7.js +0 -1
- package/build/docs/assets/js/1cc7c915.18a50af2.js +0 -1
- package/build/docs/assets/js/1dfec420.e8ed9238.js +0 -1
- package/build/docs/assets/js/1fcf59a8.501bb96b.js +0 -1
- package/build/docs/assets/js/2026.f4b8efbd.js +0 -1
- package/build/docs/assets/js/213.07804718.js +0 -1
- package/build/docs/assets/js/2297.998393a9.js +0 -1
- package/build/docs/assets/js/22c6ac39.38c10213.js +0 -1
- package/build/docs/assets/js/242.98ba961c.js +0 -1
- package/build/docs/assets/js/247.f91b8960.js +0 -1
- package/build/docs/assets/js/24b1c163.4390b04b.js +0 -1
- package/build/docs/assets/js/25ae0bf1.3ff15c6f.js +0 -1
- package/build/docs/assets/js/2673.1111af38.js +0 -1
- package/build/docs/assets/js/27c4a013.bceaff37.js +0 -1
- package/build/docs/assets/js/27c8b774.1ec1881a.js +0 -1
- package/build/docs/assets/js/2805.21b4fb8d.js +0 -1
- package/build/docs/assets/js/2b2c5b3b.41587ade.js +0 -1
- package/build/docs/assets/js/3072782a.825cd627.js +0 -1
- package/build/docs/assets/js/3204d46b.7af2b3bd.js +0 -1
- package/build/docs/assets/js/322ec2e7.529db700.js +0 -1
- package/build/docs/assets/js/336f5910.34c060aa.js +0 -1
- package/build/docs/assets/js/3395.f8117aa5.js +0 -1
- package/build/docs/assets/js/3499.2c20c6ff.js +0 -1
- package/build/docs/assets/js/3552.2d0559a3.js +0 -1
- package/build/docs/assets/js/365a2c17.6afbd7ba.js +0 -1
- package/build/docs/assets/js/379bbc32.cfc06360.js +0 -1
- package/build/docs/assets/js/3992.aa5529d1.js +0 -2
- package/build/docs/assets/js/3992.aa5529d1.js.LICENSE.txt +0 -1
- package/build/docs/assets/js/3accd241.850fb650.js +0 -1
- package/build/docs/assets/js/3b0e1261.9caf419d.js +0 -1
- package/build/docs/assets/js/3b333d5b.831324f6.js +0 -1
- package/build/docs/assets/js/3cb0b0a9.99866080.js +0 -1
- package/build/docs/assets/js/3cd01694.04367956.js +0 -1
- package/build/docs/assets/js/4069.77c5dcc9.js +0 -1
- package/build/docs/assets/js/4134.d6069e6e.js +0 -1
- package/build/docs/assets/js/413bfdf1.2e754bf4.js +0 -1
- package/build/docs/assets/js/41f4ce7f.8662231d.js +0 -1
- package/build/docs/assets/js/4257.60660403.js +0 -1
- package/build/docs/assets/js/46eb403d.e5123d24.js +0 -1
- package/build/docs/assets/js/4772.988b91f1.js +0 -1
- package/build/docs/assets/js/4780.8d49dc64.js +0 -1
- package/build/docs/assets/js/47f7a134.2369c86a.js +0 -1
- package/build/docs/assets/js/4884.48d16d5b.js +0 -1
- package/build/docs/assets/js/4acce17e.b84485e3.js +0 -1
- package/build/docs/assets/js/4b10ac31.ffdbb394.js +0 -1
- package/build/docs/assets/js/4eef183e.99934dfe.js +0 -1
- package/build/docs/assets/js/50ae2c89.ea85453c.js +0 -1
- package/build/docs/assets/js/50b500dc.b1dafbf4.js +0 -1
- package/build/docs/assets/js/5113883b.19fc9d2f.js +0 -1
- package/build/docs/assets/js/5196.dda420ed.js +0 -1
- package/build/docs/assets/js/51cd08ce.eedf6a77.js +0 -1
- package/build/docs/assets/js/5248.5442863c.js +0 -1
- package/build/docs/assets/js/533e434c.6a22f28d.js +0 -1
- package/build/docs/assets/js/53defe29.b34f5bfe.js +0 -1
- package/build/docs/assets/js/5428.28b1d8b6.js +0 -1
- package/build/docs/assets/js/54dea6f0.7b5fa5e6.js +0 -1
- package/build/docs/assets/js/550f7dc1.a569914a.js +0 -1
- package/build/docs/assets/js/5575829c.04c44eb2.js +0 -1
- package/build/docs/assets/js/58e12487.6e6066d3.js +0 -1
- package/build/docs/assets/js/59169cbb.2d2d02ce.js +0 -1
- package/build/docs/assets/js/5964.fbd55ce8.js +0 -1
- package/build/docs/assets/js/5968.7a565a4e.js +0 -1
- package/build/docs/assets/js/5c5cf8ae.cf6912f5.js +0 -1
- package/build/docs/assets/js/5ca2639d.8b06c9ea.js +0 -1
- package/build/docs/assets/js/5da011d0.872006f0.js +0 -1
- package/build/docs/assets/js/5e13701d.8a6b7fd6.js +0 -1
- package/build/docs/assets/js/5e7ee35c.01ca7414.js +0 -1
- package/build/docs/assets/js/5e8c322a.0391dec4.js +0 -1
- package/build/docs/assets/js/5e95c892.f11d5bd6.js +0 -1
- package/build/docs/assets/js/5ebc190f.49776b06.js +0 -1
- package/build/docs/assets/js/5f21eb71.536ccef3.js +0 -1
- package/build/docs/assets/js/60781fed.87f57230.js +0 -1
- package/build/docs/assets/js/61b0e64b.c86eca9e.js +0 -1
- package/build/docs/assets/js/61f3b5cc.197d138c.js +0 -1
- package/build/docs/assets/js/62e1e335.d54d1d6e.js +0 -1
- package/build/docs/assets/js/6486.776625d1.js +0 -1
- package/build/docs/assets/js/6611.481d87ff.js +0 -2
- package/build/docs/assets/js/6611.481d87ff.js.LICENSE.txt +0 -9
- package/build/docs/assets/js/6aac2d5c.95d7104d.js +0 -1
- package/build/docs/assets/js/6b345055.f4f6c3b9.js +0 -1
- package/build/docs/assets/js/6b7fcc15.290796d9.js +0 -1
- package/build/docs/assets/js/6ca90961.8833c635.js +0 -1
- package/build/docs/assets/js/6d1f0509.55213557.js +0 -1
- package/build/docs/assets/js/6daa33e8.c1c74588.js +0 -1
- package/build/docs/assets/js/7080.73a89c35.js +0 -1
- package/build/docs/assets/js/7201.26026979.js +0 -1
- package/build/docs/assets/js/7344.12628cac.js +0 -1
- package/build/docs/assets/js/749b3cb7.660b1c4b.js +0 -1
- package/build/docs/assets/js/7516.78c3385c.js +0 -1
- package/build/docs/assets/js/7525.69d857f8.js +0 -1
- package/build/docs/assets/js/7540.ee4aa270.js +0 -1
- package/build/docs/assets/js/78fde597.9598cb2a.js +0 -1
- package/build/docs/assets/js/7985.6aac4971.js +0 -1
- package/build/docs/assets/js/7b224b5a.d21317ac.js +0 -1
- package/build/docs/assets/js/7c822e85.3cc0a954.js +0 -1
- package/build/docs/assets/js/7cde3459.802fae28.js +0 -1
- package/build/docs/assets/js/7d256524.087a46e5.js +0 -1
- package/build/docs/assets/js/7d48b3e7.5d6ce912.js +0 -1
- package/build/docs/assets/js/80392bdc.dbd30f9e.js +0 -1
- package/build/docs/assets/js/8049.5b4457b0.js +0 -1
- package/build/docs/assets/js/805daf1e.305437dc.js +0 -1
- package/build/docs/assets/js/8152.32ad98ca.js +0 -1
- package/build/docs/assets/js/821.19f6a696.js +0 -1
- package/build/docs/assets/js/822e0178.3c0d623a.js +0 -1
- package/build/docs/assets/js/82894961.81f97aaf.js +0 -1
- package/build/docs/assets/js/8290.f0834113.js +0 -1
- package/build/docs/assets/js/8355.bcde11e0.js +0 -1
- package/build/docs/assets/js/8389.b3f6164d.js +0 -1
- package/build/docs/assets/js/8585.e50595e8.js +0 -1
- package/build/docs/assets/js/85dc4c9b.d835c54a.js +0 -1
- package/build/docs/assets/js/8788.c86aea45.js +0 -1
- package/build/docs/assets/js/88a4c043.ca8fd05b.js +0 -1
- package/build/docs/assets/js/90579cbd.0835e6a5.js +0 -1
- package/build/docs/assets/js/90bbfd1d.d0fd53f0.js +0 -1
- package/build/docs/assets/js/9178.f2e05b02.js +0 -1
- package/build/docs/assets/js/9210.b5a9980e.js +0 -1
- package/build/docs/assets/js/9354.77e86f51.js +0 -1
- package/build/docs/assets/js/936.275fbed5.js +0 -1
- package/build/docs/assets/js/9550cc1f.e19e7779.js +0 -1
- package/build/docs/assets/js/9574.c7203040.js +0 -1
- package/build/docs/assets/js/97.d2ed6ba9.js +0 -1
- package/build/docs/assets/js/9852.cf8f89a9.js +0 -1
- package/build/docs/assets/js/9953.90bfd954.js +0 -1
- package/build/docs/assets/js/999f4a99.31e9f0f9.js +0 -1
- package/build/docs/assets/js/99a35e8f.3cb224e6.js +0 -1
- package/build/docs/assets/js/9ab62f73.a44012b0.js +0 -1
- package/build/docs/assets/js/9ea6fe4d.ebd612bc.js +0 -1
- package/build/docs/assets/js/a09470d9.16bfeef9.js +0 -1
- package/build/docs/assets/js/a0eb976e.f6504d94.js +0 -1
- package/build/docs/assets/js/a17fb045.0c651699.js +0 -1
- package/build/docs/assets/js/a2537f00.c241e3f2.js +0 -1
- package/build/docs/assets/js/a29a6e44.58d6b878.js +0 -1
- package/build/docs/assets/js/a3ecf861.0f55d8fd.js +0 -1
- package/build/docs/assets/js/a48fd09c.50989621.js +0 -1
- package/build/docs/assets/js/a6c41565.0821af7d.js +0 -1
- package/build/docs/assets/js/a6c5c03c.0e69962a.js +0 -1
- package/build/docs/assets/js/a769954d.02ea4cc3.js +0 -1
- package/build/docs/assets/js/a7861986.e4d90417.js +0 -1
- package/build/docs/assets/js/a7bd4aaa.3faf623f.js +0 -1
- package/build/docs/assets/js/a8687130.681fc6b9.js +0 -1
- package/build/docs/assets/js/a94703ab.9865def5.js +0 -1
- package/build/docs/assets/js/a9ba6591.bcdf3f9d.js +0 -1
- package/build/docs/assets/js/ab05b3aa.63cf7d9f.js +0 -1
- package/build/docs/assets/js/aba21aa0.4d968e31.js +0 -1
- package/build/docs/assets/js/ac9d64ec.dd98824b.js +0 -1
- package/build/docs/assets/js/aeb9810c.f3c24439.js +0 -1
- package/build/docs/assets/js/b0125fa2.c7fba4da.js +0 -1
- package/build/docs/assets/js/b0ccf0d8.89a4a7e2.js +0 -1
- package/build/docs/assets/js/b1474780.0982f737.js +0 -1
- package/build/docs/assets/js/b2a255cc.df3fdd56.js +0 -1
- package/build/docs/assets/js/b31a5f55.9a4737ac.js +0 -1
- package/build/docs/assets/js/b4285021.67b039a1.js +0 -1
- package/build/docs/assets/js/b784b5bb.7d7bb82c.js +0 -1
- package/build/docs/assets/js/b8c1226b.a92653b3.js +0 -1
- package/build/docs/assets/js/b93b454c.f87b4896.js +0 -1
- package/build/docs/assets/js/bc717899.36b37795.js +0 -1
- package/build/docs/assets/js/bf1a96cc.8abf8470.js +0 -1
- package/build/docs/assets/js/c10ec81d.0dff1cac.js +0 -1
- package/build/docs/assets/js/c254daed.d6764cd8.js +0 -1
- package/build/docs/assets/js/c377a04b.a6a0a334.js +0 -1
- package/build/docs/assets/js/c52b5473.1a1069c1.js +0 -1
- package/build/docs/assets/js/c5e9787b.448cc7d9.js +0 -1
- package/build/docs/assets/js/c7710052.d061cfdd.js +0 -1
- package/build/docs/assets/js/c8a9fc86.daf30d50.js +0 -1
- package/build/docs/assets/js/c90572d4.42231642.js +0 -1
- package/build/docs/assets/js/cfad4bb4.edde6aa3.js +0 -1
- package/build/docs/assets/js/d071c513.a096e87e.js +0 -1
- package/build/docs/assets/js/d0fd4a71.1d53f49d.js +0 -1
- package/build/docs/assets/js/d1d7a857.424e14dc.js +0 -1
- package/build/docs/assets/js/d38c25bf.1430a667.js +0 -1
- package/build/docs/assets/js/d3d37933.d7f15fe8.js +0 -1
- package/build/docs/assets/js/d71e6c8a.f4306e16.js +0 -1
- package/build/docs/assets/js/d9084ecb.61eb0649.js +0 -1
- package/build/docs/assets/js/de3ee31a.0992aa16.js +0 -1
- package/build/docs/assets/js/e0db4c79.6fcade57.js +0 -1
- package/build/docs/assets/js/e4ad89b2.9ca87caa.js +0 -1
- package/build/docs/assets/js/e876cff6.7c7560ed.js +0 -1
- package/build/docs/assets/js/e917d7c9.b54a542b.js +0 -1
- package/build/docs/assets/js/e9f568e8.b96fc01f.js +0 -1
- package/build/docs/assets/js/ea5986e4.ff0e5037.js +0 -1
- package/build/docs/assets/js/eb84a108.be29052f.js +0 -1
- package/build/docs/assets/js/ed6a4585.c5d8bf90.js +0 -1
- package/build/docs/assets/js/f4180cff.dae060fd.js +0 -1
- package/build/docs/assets/js/f7084923.91b0c545.js +0 -1
- package/build/docs/assets/js/f72a372a.4118877c.js +0 -1
- package/build/docs/assets/js/f72c86d0.d74270de.js +0 -1
- package/build/docs/assets/js/f8fa0321.c4c3a620.js +0 -1
- package/build/docs/assets/js/fc7c782f.bc0ad1ab.js +0 -1
- package/build/docs/assets/js/fce396bf.9f7f818c.js +0 -1
- package/build/docs/assets/js/fdb0d9e1.d2893206.js +0 -1
- package/build/docs/assets/js/fed4ae4f.e788c07f.js +0 -1
- package/build/docs/assets/js/fefe9566.113c5960.js +0 -1
- package/build/docs/assets/js/ff0bf96e.e457283e.js +0 -1
- package/build/docs/assets/js/ff6d65a9.39317a08.js +0 -1
- package/build/docs/assets/js/main.7d445fc8.js +0 -2
- package/build/docs/assets/js/main.7d445fc8.js.LICENSE.txt +0 -51
- package/build/docs/assets/js/runtime~main.5c8a1e20.js +0 -1
- package/build/docs/img/favicon.ico +0 -0
- package/build/docs/img/logo.jpeg +0 -0
- package/build/docs/img/logo.svg +0 -22
- package/build/docs/img/readme.md +0 -1
- package/build/docs/index.html +0 -102
- package/build/docs/readme.md +0 -1
- package/build/docs/sitemap.xml +0 -1
- package/build/docs/usage-guide/index.html +0 -580
- package/demo/6879.3434f1e9.iframe.bundle.js.br +0 -0
- package/demo/6879.3434f1e9.iframe.bundle.js.gz +0 -0
- package/demo/docs/6879.3434f1e9.iframe.bundle.js.br +0 -0
- package/demo/docs/6879.3434f1e9.iframe.bundle.js.gz +0 -0
- package/demo/docs/main.703b0e4c.iframe.bundle.js +0 -5
- package/demo/docs/main.703b0e4c.iframe.bundle.js.br +0 -0
- package/demo/docs/main.703b0e4c.iframe.bundle.js.gz +0 -0
- package/demo/main.703b0e4c.iframe.bundle.js +0 -5
- package/demo/main.703b0e4c.iframe.bundle.js.br +0 -0
- package/demo/main.703b0e4c.iframe.bundle.js.gz +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[5908],{8745(e,n,i){i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"usage-guide","title":"Usage Guide","description":"This guide provides detailed examples and patterns for using the PUI App SDK in your applications. For initial setup, see the Getting Started Guide.","source":"@site/docs/usage-guide.md","sourceDirName":".","slug":"/usage-guide","permalink":"/app-sdk/usage-guide","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/usage-guide.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Getting Started","permalink":"/app-sdk/"}}');var s=i(6070),r=i(5589);const o={},a="Usage Guide",l={},c=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Routing",id:"routing",level:2},{value:"Lazy Loading Components",id:"lazy-loading-components",level:3},{value:"Authentication",id:"authentication",level:2},{value:"API Integration with RTK Query",id:"api-integration-with-rtk-query",level:2},{value:"Setting Up RTK Query API",id:"setting-up-rtk-query-api",level:3},{value:"Injecting RTK Query API",id:"injecting-rtk-query-api",level:3},{value:"Using RTK Query in Components",id:"using-rtk-query-in-components",level:3},{value:"Advanced RTK Query Features",id:"advanced-rtk-query-features",level:3},{value:"Conditional Fetching",id:"conditional-fetching",level:4},{value:"Polling",id:"polling",level:4},{value:"Optimistic Updates",id:"optimistic-updates",level:4},{value:"Why RTK Query?",id:"why-rtk-query",level:3},{value:"HTTP Client (Legacy)",id:"http-client-legacy",level:2},{value:"getAuthHTTPClient",id:"getauthhttpclient",level:3},{value:"getHTTPClient",id:"gethttpclient",level:3},{value:"onAuthorizationFailure",id:"onauthorizationfailure",level:3},{value:"httpClientProps",id:"httpclientprops",level:3},{value:"Typed Selectors",id:"typed-selectors",level:3},{value:"Using State in Components",id:"using-state-in-components",level:3},{value:"Layout Component with Dynamic Injection",id:"layout-component-with-dynamic-injection",level:3},{value:"Redux Saga Side Effects (Legacy Pattern)",id:"redux-saga-side-effects-legacy-pattern",level:3},{value:"Redux Internals",id:"redux-internals",level:2},{value:"getStore",id:"getstore",level:3},{value:"authReducer & authSaga",id:"authreducer--authsaga",level:3},{value:"errorMiddleware",id:"errormiddleware",level:3},{value:"createManager",id:"createmanager",level:3},{value:"Form Management",id:"form-management",level:2},{value:"Analytics",id:"analytics",level:2},{value:"Timing Events",id:"timing-events",level:3},{value:"Business Analytics Events",id:"business-analytics-events",level:3},{value:"Direct Analytics Exports",id:"direct-analytics-exports",level:3},{value:"sendBAEvent (deprecated)",id:"sendbaevent-deprecated",level:4},{value:"fetchUserSettings",id:"fetchusersettings",level:3},{value:"Micro-Frontends",id:"micro-frontends",level:2},{value:"Hosting Micro-Frontends",id:"hosting-micro-frontends",level:3},{value:"Micro-Frontend Configuration",id:"micro-frontend-configuration",level:3},{value:"Navigation & History Modes",id:"navigation--history-modes",level:3},{value:"<code>useParentHistory: true</code> (default) \u2014 Shared History",id:"useparenthistory-true-default--shared-history",level:4},{value:"<code>useParentHistory: false</code> \u2014 Independent History",id:"useparenthistory-false--independent-history",level:4},{value:"Setting an Initial Route from the Host",id:"setting-an-initial-route-from-the-host",level:4},{value:"Quick Reference",id:"quick-reference",level:4},{value:"Guest App <code>app.config.json</code> Example",id:"guest-app-appconfigjson-example",level:4},{value:"Micro-Frontend Host API",id:"micro-frontend-host-api",level:3},{value:"selfInitialize is Required",id:"selfinitialize-is-required",level:4},{value:"CMicroAppHost (Deprecated)",id:"cmicroapphost-deprecated",level:4},{value:"enableReactAppForHostIntegration",id:"enablereactappforhostintegration",level:4},{value:"getMicroFrontEndAppConfig",id:"getmicrofrontendappconfig",level:4},{value:"getNavigationLinks",id:"getnavigationlinks",level:4},{value:"getLogger",id:"getlogger",level:4},{value:"Deprecated Components",id:"deprecated-components",level:4},{value:"Guest-Initiated Loading",id:"guest-initiated-loading",level:3},{value:"Enabling Self-Initialize in app.config.json",id:"enabling-self-initialize-in-appconfigjson",level:4},{value:"Setting Up a Self-Initializing Guest",id:"setting-up-a-self-initializing-guest",level:4},{value:"Standalone Mode",id:"standalone-mode",level:4},{value:"Host Discovery (<code>window.emui.getHost</code>)",id:"host-discovery-windowemuigethost",level:3},{value:"SDK-based guests",id:"sdk-based-guests",level:4},{value:"Availability",id:"availability",level:4},{value:"Module Scripting Object",id:"module-scripting-object",level:3},{value:"createGuestModule",id:"createguestmodule",level:4},{value:"buildModuleParams",id:"buildmoduleparams",level:4},{value:"GuestModule Class",id:"guestmodule-class",level:4},{value:"Automatic Manifest Warm-Up",id:"automatic-manifest-warm-up",level:3},{value:"Scripting Objects",id:"scripting-objects",level:2},{value:"Adding Scripting Objects",id:"adding-scripting-objects",level:3},{value:"Using Scripting Objects in Components",id:"using-scripting-objects-in-components",level:3},{value:"Wait Messages",id:"wait-messages",level:2},{value:"Using WaitMessage Component",id:"using-waitmessage-component",level:3},{value:"Wait Message Props",id:"wait-message-props",level:3},{value:"Navigation Prompts",id:"navigation-prompts",level:2},{value:"Dispatch Navigation Prompt Actions",id:"dispatch-navigation-prompt-actions",level:3},{value:"Error Handling",id:"error-handling",level:2},{value:"Global Error Toast",id:"global-error-toast",level:3},{value:"Clear Errors",id:"clear-errors",level:3},{value:"ARIA Live Messages",id:"aria-live-messages",level:2},{value:"Decorators",id:"decorators",level:2},{value:"Function Decorators",id:"function-decorators",level:3},{value:"Class Decorators",id:"class-decorators",level:3},{value:"Advanced State Selectors",id:"advanced-state-selectors",level:2},{value:"Using useStateSelector",id:"using-usestateselector",level:3},{value:"Responsive Design",id:"responsive-design",level:2},{value:"Media Query Hook",id:"media-query-hook",level:3},{value:"Environment & URL Utilities",id:"environment--url-utilities",level:2},{value:"Environment Detection",id:"environment-detection",level:3},{value:"History Instances",id:"history-instances",level:3},{value:"removeDoubleSlash",id:"removedoubleslash",level:3},{value:"Themes",id:"themes",level:3},{value:"Security Utilities",id:"security-utilities",level:2},{value:"PII Redaction",id:"pii-redaction",level:3},{value:"Listener Middleware",id:"listener-middleware",level:2},{value:"Session Management",id:"session-management",level:2},{value:"Session Timeout Handling",id:"session-timeout-handling",level:3},{value:"Session UI Components",id:"session-ui-components",level:3},{value:"SessionTimeout",id:"sessiontimeout",level:4},{value:"WaitMessage",id:"waitmessage",level:4},{value:"Initialize Session Management",id:"initialize-session-management",level:3},{value:"LogRocket Integration",id:"logrocket-integration",level:3},{value:"Initialization",id:"initialization",level:4},{value:"User Identification",id:"user-identification",level:4},{value:"Tracking Events",id:"tracking-events",level:4},{value:"Logout",id:"logout",level:4},{value:"Service Worker",id:"service-worker",level:3},{value:"App Configuration",id:"app-configuration",level:2},{value:"Loading Configuration",id:"loading-configuration",level:3},{value:"Get Full Configuration",id:"get-full-configuration",level:3},{value:"Update Configuration Values",id:"update-configuration-values",level:3},{value:"Web Storage Events",id:"web-storage-events",level:2},{value:"Micro-Frontend Communication",id:"micro-frontend-communication",level:2},{value:"Host App Data Exchange",id:"host-app-data-exchange",level:3},{value:"Guest Unload Handlers",id:"guest-unload-handlers",level:3},{value:"Render with Host Data",id:"render-with-host-data",level:3},{value:"Authentication Utilities",id:"authentication-utilities",level:2},{value:"Auth Helper Functions",id:"auth-helper-functions",level:3},{value:"Auth Subpath Exports",id:"auth-subpath-exports",level:3},{value:"getIDPInfoFromUrl",id:"getidpinfofromurl",level:4},{value:"navigateToLoginPage",id:"navigatetologinpage",level:4},{value:"Require Auth Component",id:"require-auth-component",level:3},{value:"Utility Hooks",id:"utility-hooks",level:2},{value:"useInjectQuery",id:"useinjectquery",level:3},{value:"useInjectSideEffect",id:"useinjectsideeffect",level:3},{value:"useAppMiddleware",id:"useappmiddleware",level:3},{value:"Form Components",id:"form-components",level:2},{value:"Available Form Components",id:"available-form-components",level:3},{value:"TextBox",id:"textbox",level:3},{value:"InputMask",id:"inputmask",level:3},{value:"ComboBox",id:"combobox",level:3},{value:"DatePicker",id:"datepicker",level:3},{value:"DateRangePicker",id:"daterangepicker",level:3},{value:"CheckBox",id:"checkbox",level:3},{value:"RadioGroup",id:"radiogroup",level:3},{value:"Toggle",id:"toggle",level:3},{value:"Autocomplete",id:"autocomplete",level:3},{value:"Form Layout",id:"form-layout",level:3},{value:"Reading the React Hook Form Configuration (<code>FormPropsContext</code>)",id:"reading-the-react-hook-form-configuration-formpropscontext",level:3},{value:"Storybook Integration",id:"storybook-integration",level:2},{value:"Utility Components",id:"utility-components",level:2},{value:"VisuallyHidden",id:"visuallyhidden",level:3},{value:"Page Component",id:"page-component",level:3},{value:"Testing",id:"testing",level:2},{value:"Testing with Redux",id:"testing-with-redux",level:3},{value:"Testing Library Re-exports",id:"testing-library-re-exports",level:3},{value:"RenderWithStateAddOns",id:"renderwithstateaddons",level:3},{value:"Common Patterns",id:"common-patterns",level:2},{value:"Error Boundaries",id:"error-boundaries",level:3},{value:"API Error Handling with RTK Query",id:"api-error-handling-with-rtk-query",level:3},{value:"API Error Handling (Legacy Pattern)",id:"api-error-handling-legacy-pattern",level:3},{value:"Type Exports",id:"type-exports",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Store Not Initialized",id:"store-not-initialized",level:3},{value:"Saga Not Running",id:"saga-not-running",level:3},{value:"Scripting Objects Not Available",id:"scripting-objects-not-available",level:3},{value:"Form Validation Issues",id:"form-validation-issues",level:3},{value:"Host-Guest Communication",id:"host-guest-communication",level:3}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"usage-guide",children:"Usage Guide"})}),"\n",(0,s.jsxs)(n.p,{children:["This guide provides detailed examples and patterns for using the PUI App SDK in your applications. For initial setup, see the ",(0,s.jsx)(n.a,{href:"/app-sdk/",children:"Getting Started Guide"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"table-of-contents",children:"Table of Contents"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#routing",children:"Routing"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#authentication",children:"Authentication"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#api-integration-with-rtk-query",children:"API Integration with RTK Query"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#http-client-legacy",children:"HTTP Client (Legacy)"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#gethttpclient",children:"getHTTPClient"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#onauthorizationfailure",children:"onAuthorizationFailure"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#httpclientprops",children:"httpClientProps"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#redux-internals",children:"Redux Internals"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#state-management",children:"State Management"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#form-management",children:"Form Management"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#analytics",children:"Analytics"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#direct-analytics-exports",children:"Direct Analytics Exports"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#fetchusersettings",children:"fetchUserSettings"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#micro-frontends",children:"Micro-Frontends"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#navigation--history-modes",children:"Navigation & History Modes"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#micro-frontend-host-api",children:"Micro-Frontend Host API"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#guest-initiated-loading",children:"Guest-Initiated Loading"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsxs)(n.a,{href:"#host-discovery-windowemuigethost",children:["Host Discovery (",(0,s.jsx)(n.code,{children:"window.emui.getHost"}),")"]})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#module-scripting-object",children:"Module Scripting Object"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#scripting-objects",children:"Scripting Objects"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#wait-messages",children:"Wait Messages"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#navigation-prompts",children:"Navigation Prompts"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#error-handling",children:"Error Handling"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#aria-live-messages",children:"ARIA Live Messages"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#decorators",children:"Decorators"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#advanced-state-selectors",children:"Advanced State Selectors"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#responsive-design",children:"Responsive Design"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#environment--url-utilities",children:"Environment & URL Utilities"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#security-utilities",children:"Security Utilities"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#listener-middleware",children:"Listener Middleware"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#session-management",children:"Session Management"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#session-ui-components",children:"Session UI Components"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#logrocket-integration",children:"LogRocket Integration"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#app-configuration",children:"App Configuration"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#web-storage-events",children:"Web Storage Events"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#micro-frontend-communication",children:"Micro-Frontend Communication"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#authentication-utilities",children:"Authentication Utilities"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#auth-subpath-exports",children:"Auth Subpath Exports"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#utility-hooks",children:"Utility Hooks"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#form-components",children:"Form Components"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#storybook-integration",children:"Storybook Integration"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#utility-components",children:"Utility Components"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#testing",children:"Testing"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#testing-library-re-exports",children:"Testing Library Re-exports"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#renderwithstateaddons",children:"RenderWithStateAddOns"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#type-exports",children:"Type Exports"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#common-patterns",children:"Common Patterns"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#troubleshooting",children:"Troubleshooting"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"routing",children:"Routing"}),"\n",(0,s.jsx)(n.p,{children:"Set up routing with React Router and SDK components:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { Routes, Route } from 'react-router-dom';\nimport { RequireAuth, useInjectSaga, Page } from '@elliemae/pui-app-sdk';\nimport { Layout } from './view/layout';\nimport { onSessionEvent } from './sideeffect/session';\n\nconst key = 'session';\n\nexport const AppRoutes = () => {\n // Inject session management saga\n useInjectSaga({ key, saga: onSessionEvent });\n\n return (\n <Routes>\n <Route path=\"/\" element={<Layout />}>\n <Route\n index\n element={\n <Page pageTitle=\"Dashboard\">\n <Dashboard />\n </Page>\n }\n />\n <Route\n path=\"details/:id\"\n element={\n <Page pageTitle=\"Details\">\n <DetailsView />\n </Page>\n }\n />\n </Route>\n </Routes>\n );\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"lazy-loading-components",children:"Lazy Loading Components"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { loadable } from '@elliemae/pui-app-sdk';\n\n// Create loadable component\nexport const LoanView = loadable(() => import('./index'), {\n fallback: <div>Loading...</div>,\n});\n\n// Use in routes\nimport { LoanView } from './view/loan-view/loadable';\n\nconst AppRoutes = () => (\n <Routes>\n <Route path=\"/loans\" element={<LoanView />} />\n </Routes>\n);\n"})}),"\n",(0,s.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,s.jsx)(n.p,{children:"Handle authentication and logout with Redux Saga:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n auth,\n globalConstants,\n getRedirectUrl,\n logout,\n error,\n} from '@elliemae/pui-app-sdk';\nimport { call, put, takeLatest } from 'redux-saga/effects';\n\nfunction* endSessionHandler() {\n try {\n const cred = sessionStorage.getItem('Authorization') || '';\n yield call(endSession, { token: cred });\n\n // Trigger logout\n yield put(\n auth.logout({\n clientId: globalConstants.CLIENT_ID,\n redirectUri: getRedirectUrl(),\n responseType: 'code',\n scope: 'loc',\n code: '1004',\n }),\n );\n } catch (err) {\n yield put(error.set({ messageText: (err as Error)?.message }));\n }\n}\n\nexport function* onSessionEvent() {\n yield takeLatest(logout.CONFIRM, endSessionHandler);\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"api-integration-with-rtk-query",children:"API Integration with RTK Query"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Recommended Approach"}),": RTK Query is the preferred method for API integration, providing automatic caching, request deduplication, and simplified data fetching."]}),"\n",(0,s.jsx)(n.h3,{id:"setting-up-rtk-query-api",children:"Setting Up RTK Query API"}),"\n",(0,s.jsxs)(n.p,{children:["Create an API slice using RTK Query with the SDK's ",(0,s.jsx)(n.code,{children:"sdkBaseQuery"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { createApi } from '@reduxjs/toolkit/query/react';\nimport { sdkBaseQuery } from '@elliemae/pui-app-sdk';\n\n// Define API slice\nexport const resourcesApi = createApi({\n reducerPath: 'resourcesApi',\n baseQuery: sdkBaseQuery({ baseUrl: '/v1' }),\n tagTypes: ['Resources'],\n endpoints: (builder) => ({\n getResources: builder.query<ResourceRecord[], void>({\n query: () => ({\n url: '/resources',\n method: 'GET',\n }),\n providesTags: ['Resources'],\n }),\n getResourceById: builder.query<ResourceRecord, string>({\n query: (id) => ({\n url: `/resources/${id}`,\n method: 'GET',\n }),\n providesTags: (result, error, id) => [{ type: 'Resources', id }],\n }),\n createResource: builder.mutation<ResourceRecord, CreateResourceRequest>({\n query: (payload) => ({\n url: '/resources',\n method: 'POST',\n data: payload,\n }),\n invalidatesTags: ['Resources'],\n }),\n updateResource: builder.mutation<\n ResourceRecord,\n { id: string; data: UpdateResourceRequest }\n >({\n query: ({ id, data }) => ({\n url: `/resources/${id}`,\n method: 'PUT',\n data,\n }),\n invalidatesTags: (result, error, { id }) => [{ type: 'Resources', id }],\n }),\n deleteResource: builder.mutation<void, string>({\n query: (id) => ({\n url: `/resources/${id}`,\n method: 'DELETE',\n }),\n invalidatesTags: ['Resources'],\n }),\n }),\n});\n\nexport const {\n useGetResourcesQuery,\n useGetResourceByIdQuery,\n useCreateResourceMutation,\n useUpdateResourceMutation,\n useDeleteResourceMutation,\n} = resourcesApi;\n"})}),"\n",(0,s.jsx)(n.h3,{id:"injecting-rtk-query-api",children:"Injecting RTK Query API"}),"\n",(0,s.jsxs)(n.p,{children:["Use the SDK's ",(0,s.jsx)(n.code,{children:"useInjectQuery"})," hook to dynamically inject the API:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useInjectQuery } from '@elliemae/pui-app-sdk';\nimport { resourcesApi } from './api/resources';\n\nexport const Layout = () => {\n // Inject RTK Query API\n useInjectQuery({ api: resourcesApi });\n\n return (\n <div>\n <Header />\n <Outlet />\n </div>\n );\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-rtk-query-in-components",children:"Using RTK Query in Components"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n useGetResourcesQuery,\n useCreateResourceMutation,\n useUpdateResourceMutation,\n} from './api/resources';\nimport { waitMessageAction, useAppDispatch } from '@elliemae/pui-app-sdk';\n\nfunction ResourceList() {\n const dispatch = useAppDispatch();\n\n // Fetch resources with automatic caching and refetching\n const { data: resources, isLoading, error, refetch } = useGetResourcesQuery();\n\n // Mutations\n const [createResource, { isLoading: isCreating }] =\n useCreateResourceMutation();\n const [updateResource, { isLoading: isUpdating }] =\n useUpdateResourceMutation();\n\n // Show wait message while loading\n useEffect(() => {\n if (isLoading || isCreating || isUpdating) {\n dispatch(waitMessageAction.open('Loading...', true));\n } else {\n dispatch(waitMessageAction.close());\n }\n }, [isLoading, isCreating, isUpdating, dispatch]);\n\n const handleCreate = async () => {\n try {\n await createResource({\n name: 'New Resource',\n description: 'Description',\n }).unwrap();\n // Success - data automatically refetched due to cache invalidation\n } catch (err) {\n console.error('Failed to create resource:', err);\n }\n };\n\n const handleUpdate = async (id: string) => {\n try {\n await updateResource({\n id,\n data: { name: 'Updated Name' },\n }).unwrap();\n } catch (err) {\n console.error('Failed to update resource:', err);\n }\n };\n\n if (error) return <div>Error loading resources</div>;\n if (isLoading) return <div>Loading...</div>;\n\n return (\n <div>\n <button onClick={handleCreate}>Create Resource</button>\n {resources?.map((resource) => (\n <div key={resource.id}>\n <h3>{resource.name}</h3>\n <button onClick={() => handleUpdate(resource.id)}>Update</button>\n </div>\n ))}\n </div>\n );\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"advanced-rtk-query-features",children:"Advanced RTK Query Features"}),"\n",(0,s.jsx)(n.h4,{id:"conditional-fetching",children:"Conditional Fetching"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"function ResourceDetails({ resourceId }: { resourceId?: string }) {\n // Skip query if no resourceId\n const { data, isLoading } = useGetResourceByIdQuery(resourceId!, {\n skip: !resourceId,\n });\n\n return <div>{data?.name}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h4,{id:"polling",children:"Polling"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"function ResourceList() {\n // Poll every 30 seconds\n const { data } = useGetResourcesQuery(undefined, {\n pollingInterval: 30000,\n });\n\n return <div>{/* render resources */}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h4,{id:"optimistic-updates",children:"Optimistic Updates"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const [updateResource] = useUpdateResourceMutation();\n\nconst handleUpdate = async (id: string, newName: string) => {\n try {\n await updateResource({\n id,\n data: { name: newName },\n }).unwrap();\n } catch (err) {\n // Update failed, cache automatically reverted\n }\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"why-rtk-query",children:"Why RTK Query?"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Automatic Caching"}),": Reduces unnecessary network requests"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Request Deduplication"}),": Multiple components can use the same query without duplicate requests"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Automatic Refetching"}),": Data stays fresh with polling, refetch on focus, etc."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Optimistic Updates"}),": Update UI before server response"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Error Handling"}),": Built-in error states"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Loading States"}),": Automatic loading indicators"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"TypeScript Support"}),": Full type safety"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Less Boilerplate"}),": No need for actions, reducers, or sagas for API calls"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"http-client-legacy",children:"HTTP Client (Legacy)"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note"}),": For new projects, prefer ",(0,s.jsx)(n.a,{href:"#api-integration-with-rtk-query",children:"RTK Query"})," for API integration. Use the HTTP client directly only when you need fine-grained control or are working with existing code."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"getauthhttpclient",children:"getAuthHTTPClient"}),"\n",(0,s.jsx)(n.p,{children:"Make authenticated API calls with automatic token management:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getAuthHTTPClient } from '@elliemae/pui-app-sdk';\nimport { logger } from './utils/logger';\n\nconst basePath = '/v1/resources';\n\nexport const getResources = async () => {\n try {\n const { data } = await getAuthHTTPClient().get(basePath);\n return data;\n } catch (err) {\n logger.error({\n message: 'Failed to get resources',\n exception: err as Error,\n });\n throw err;\n }\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"gethttpclient",children:"getHTTPClient"}),"\n",(0,s.jsxs)(n.p,{children:["Create an HTTP client ",(0,s.jsx)(n.strong,{children:"without"})," automatic authorization headers. Useful for public endpoints or when you supply your own auth:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getHTTPClient } from '@elliemae/pui-app-sdk';\n\nconst publicClient = getHTTPClient({\n baseURL: 'https://public-api.example.com',\n headers: { 'X-Api-Key': 'my-key' },\n sendLogRocketSessionHeader: true,\n});\n\nconst { data } = await publicClient.get('/status');\n"})}),"\n",(0,s.jsx)(n.p,{children:"Options:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Option"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"baseURL"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"string"})}),(0,s.jsxs)(n.td,{children:["App config ",(0,s.jsx)(n.code,{children:"serviceEndpoints.api"})]}),(0,s.jsx)(n.td,{children:"Base URL for requests"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"headers"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"object"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"{}"})}),(0,s.jsx)(n.td,{children:"Custom request headers"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"sendLogRocketSessionHeader"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"boolean"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})}),(0,s.jsxs)(n.td,{children:["Attach ",(0,s.jsx)(n.code,{children:"X-LogRocket-URL"})," header"]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"onauthorizationfailure",children:"onAuthorizationFailure"}),"\n",(0,s.jsx)(n.p,{children:"Register a callback to handle 401 responses. The SDK will retry the failed request with the new authorization header you return:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { onAuthorizationFailure } from '@elliemae/pui-app-sdk';\n\nonAuthorizationFailure(async (error) => {\n const newToken = await refreshAuthToken();\n sessionStorage.setItem('Authorization', newToken);\n return newToken;\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If no handler is registered, a 401 response triggers ",(0,s.jsx)(n.code,{children:"endSession"})," (redirect to login)."]}),"\n",(0,s.jsx)(n.h3,{id:"httpclientprops",children:"httpClientProps"}),"\n",(0,s.jsxs)(n.p,{children:["Bind session management callbacks to the HTTP layer. ",(0,s.jsx)(n.code,{children:"AppRoot"})," sets these automatically, but you can configure them manually when bootstrapping without ",(0,s.jsx)(n.code,{children:"AppRoot"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n httpClientProps,\n resetUserIdleTime,\n endSession,\n} from '@elliemae/pui-app-sdk';\n\nhttpClientProps.resetUserIdleTime = resetUserIdleTime;\nhttpClientProps.endSession = endSession;\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"\n## State Management\n\n> **Recommended**: For API-related state management, use [RTK Query](#api-integration-with-rtk-query) instead of manually creating actions, reducers, and sagas.\n\n### Creating Actions and Reducers (Legacy Pattern)\n\nFor non-API state or when working with existing code, use Redux Toolkit with the SDK's API action creator:\n\n```typescript\nimport { createSlice, PayloadActionCreator } from '@reduxjs/toolkit';\nimport { getApiActionCreator } from '@elliemae/pui-app-sdk';\n\nconst resourcesActionCreator = getApiActionCreator('resources');\n\ntype GetResourceActions = {\n get: PayloadActionCreator<void, string>;\n getSuccess: PayloadActionCreator<Array<ResourceRecord>, string>;\n getError: PayloadActionCreator<void, string>;\n};\n\ntype CreateResourceActions = {\n create: PayloadActionCreator<void, string>;\n createSuccess: PayloadActionCreator<CreateResourceResponse, string>;\n createError: PayloadActionCreator<void, string>;\n};\n\nexport const resources = {\n ...(resourcesActionCreator('create') as unknown as CreateResourceActions),\n ...(resourcesActionCreator('get') as unknown as GetResourceActions),\n};\n\nconst resourcesSlice = createSlice({\n name: 'resources',\n initialState: [] as Array<ResourceRecord>,\n reducers: {\n getSuccess: (state, { payload }: { payload: Array<ResourceRecord> }) => {\n state.push(...payload);\n },\n },\n});\n\nexport const { reducer } = resourcesSlice;\n"})}),"\n",(0,s.jsx)(n.h3,{id:"typed-selectors",children:"Typed Selectors"}),"\n",(0,s.jsx)(n.p,{children:"Create typed selectors for better type safety:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { TypedUseSelectorHook, useSelector } from 'react-redux';\nimport { RootState } from '@elliemae/pui-app-sdk';\nimport { reducer } from './data/resources';\n\n// Create typed selector\ntype AppState = RootState & { resources: ReturnType<typeof reducer> };\nexport const useAppSelector: TypedUseSelectorHook<AppState> = useSelector;\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-state-in-components",children:"Using State in Components"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useAppDispatch, useAppSelector } from '@elliemae/pui-app-sdk';\n\nfunction ResourceList() {\n const resourcesData = useAppSelector((state) => state.resources);\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n if (!resourcesData.length) {\n dispatch(resources.get());\n }\n }, [dispatch, resourcesData.length]);\n\n return <div>{/* render resources */}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"layout-component-with-dynamic-injection",children:"Layout Component with Dynamic Injection"}),"\n",(0,s.jsx)(n.p,{children:"Inject reducers and sagas at the layout level:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { Outlet } from 'react-router-dom';\nimport { useInjectReducer, useInjectSaga } from '@elliemae/pui-app-sdk';\nimport { reducer } from './data/resources';\nimport { resourceSagas } from './sideeffect/resources';\n\nexport const Layout = () => {\n // Inject reducer and saga at layout level\n useInjectReducer({ key: 'resources', reducer });\n useInjectSaga({ key: 'resources', saga: resourceSagas });\n\n return (\n <div>\n <Header />\n <Outlet />\n </div>\n );\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"redux-saga-side-effects-legacy-pattern",children:"Redux Saga Side Effects (Legacy Pattern)"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note"}),": RTK Query eliminates the need for sagas in most API use cases. Use sagas for complex async workflows, WebSocket connections, or custom side effects not related to API calls."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Handle async operations with Redux Saga:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { all, fork } from 'redux-saga/effects';\nimport { logger } from './utils/logger';\nimport { onGetAllResources } from './get';\nimport { onCreateResource } from './create';\n\nexport function* resourceSagas() {\n try {\n yield all([fork(onCreateResource), fork(onGetAllResources)]);\n } catch (err) {\n logger.error({\n message: 'Saga initialization error',\n exception: err as Error,\n });\n }\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"redux-internals",children:"Redux Internals"}),"\n",(0,s.jsxs)(n.p,{children:["These lower-level exports are pre-wired by the SDK. You only need them for advanced bootstrapping or when not using ",(0,s.jsx)(n.code,{children:"AppRoot"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"getstore",children:"getStore"}),"\n",(0,s.jsx)(n.p,{children:"Access the global Redux store outside of React components (e.g. in sagas, utilities, or test setup):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getStore } from '@elliemae/pui-app-sdk';\n\nconst store = getStore();\nstore.dispatch(someAction());\nconst state = store.getState();\n"})}),"\n",(0,s.jsx)(n.h3,{id:"authreducer--authsaga",children:"authReducer & authSaga"}),"\n",(0,s.jsxs)(n.p,{children:["The SDK includes a built-in auth reducer and saga that handle ",(0,s.jsx)(n.code,{children:"auth.login()"})," / ",(0,s.jsx)(n.code,{children:"auth.logout()"})," actions. They are automatically injected by ",(0,s.jsx)(n.code,{children:"AppRoot"}),", but can be manually wired if needed:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { authReducer, authSaga } from '@elliemae/pui-app-sdk';\n\n// Manual injection (only if not using AppRoot)\nuseInjectReducer({ key: 'auth', reducer: authReducer });\nuseInjectSaga({ key: 'auth', saga: authSaga });\n"})}),"\n",(0,s.jsx)(n.p,{children:"The auth saga listens for:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"auth.login()"})," \u2014 calls ",(0,s.jsx)(n.code,{children:"authorize()"})," and dispatches ",(0,s.jsx)(n.code,{children:"LOGIN_SUCCESS"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"auth.logout()"})," \u2014 calls ",(0,s.jsx)(n.code,{children:"endSession()"})," with the provided params"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"errormiddleware",children:"errorMiddleware"}),"\n",(0,s.jsxs)(n.p,{children:["Redux middleware that automatically dispatches ",(0,s.jsx)(n.code,{children:"error.set()"})," for any RTK Query rejected action:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { errorMiddleware } from '@elliemae/pui-app-sdk';\n\n// Already included in configureStore() \u2014 no manual setup needed.\n// Shown here for reference only.\n"})}),"\n",(0,s.jsx)(n.p,{children:"When any RTK Query mutation or query is rejected with a value, the middleware extracts the error message and dispatches it to the global error toast."}),"\n",(0,s.jsx)(n.h3,{id:"createmanager",children:"createManager"}),"\n",(0,s.jsxs)(n.p,{children:["Re-exported from ",(0,s.jsx)(n.code,{children:"redux-injectors"}),". Create a standalone injector manager for manual reducer/saga injection outside React:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { createManager } from '@elliemae/pui-app-sdk';\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["In most cases, use ",(0,s.jsx)(n.code,{children:"useInjectReducer"})," / ",(0,s.jsx)(n.code,{children:"useInjectSaga"})," hooks inside components instead."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"form-management",children:"Form Management"}),"\n",(0,s.jsx)(n.p,{children:"Build forms with validation using React Hook Form integration:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { Form as SDKForm, useAppDispatch } from '@elliemae/pui-app-sdk';\nimport { useParams } from 'react-router-dom';\nimport { SubmitHandler } from 'react-hook-form';\nimport { resources } from './data/resources';\n\ninterface FormData {\n firstName: string;\n lastName: string;\n email: string;\n country?: { value: string; label: string };\n}\n\nexport const MyForm = () => {\n const dispatch = useAppDispatch();\n const { id } = useParams<{ id: string }>();\n\n const onSubmit: SubmitHandler<FormData> = (formData) => {\n const { country, ...rest } = formData;\n\n dispatch(\n resources.save({\n id,\n ...rest,\n country: country?.value || country,\n }),\n );\n };\n\n return (\n <SDKForm<FormData> onSubmit={onSubmit}>\n <FormFields />\n <SubmitButton />\n </SDKForm>\n );\n};\n"})}),"\n",(0,s.jsx)(n.h2,{id:"analytics",children:"Analytics"}),"\n",(0,s.jsx)(n.p,{children:"Track user events and page views using scripting objects:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { CMicroApp } from '@elliemae/pui-app-sdk';\nimport { IAnalytics } from '@elliemae/pui-scripting-object';\nimport { logger } from './utils/logger';\n\nlet analyticsObj: IAnalytics | null = null;\n\nexport const getAnalytics = async () => {\n if (!analyticsObj) {\n try {\n const app = CMicroApp.getInstance();\n analyticsObj = (await app.getObject('analytics')) ?? null;\n } catch (error) {\n logger.error({\n message: 'Error fetching analytics object',\n exception: error as Error,\n });\n }\n }\n return analyticsObj;\n};\n\nexport const getAppDetails = () => ({\n appId: window.emui?.appId || '',\n appUrl: window.location.href,\n});\n"})}),"\n",(0,s.jsx)(n.h3,{id:"timing-events",children:"Timing Events"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// Use in component\nuseEffect(() => {\n (async () => {\n const analytics = await getAnalytics();\n if (analytics) {\n await analytics.startTiming('PageLoad', getAppDetails());\n // ... perform operation\n await analytics.endTiming('PageLoad', getAppDetails());\n }\n })();\n}, []);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"business-analytics-events",children:"Business Analytics Events"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"useEffect(() => {\n if (recordId) {\n (async () => {\n const analytics = await getAnalytics();\n if (analytics) {\n await analytics.sendBAEvent({\n event: 'RecordViewed',\n recordId,\n });\n }\n })();\n }\n}, [recordId]);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"direct-analytics-exports",children:"Direct Analytics Exports"}),"\n",(0,s.jsxs)(n.p,{children:["The SDK also re-exports analytics utilities from ",(0,s.jsx)(n.code,{children:"@elliemae/pui-analytics-so"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { Analytics, updateBAEventParameters } from '@elliemae/pui-app-sdk';\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"Analytics"})})," \u2014 the analytics singleton from ",(0,s.jsx)(n.code,{children:"pui-analytics-so"}),". Prefer using the scripting object approach (above) instead of importing ",(0,s.jsx)(n.code,{children:"Analytics"})," directly."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"updateBAEventParameters"})})," \u2014 update the shared BA event parameters (e.g. ",(0,s.jsx)(n.code,{children:"instanceId"}),", ",(0,s.jsx)(n.code,{children:"userId"}),") that are merged into every ",(0,s.jsx)(n.code,{children:"sendBAEvent"})," call. The SDK calls this automatically during ",(0,s.jsx)(n.code,{children:"authorize()"})," and ",(0,s.jsx)(n.code,{children:"endSession()"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"sendbaevent-deprecated",children:"sendBAEvent (deprecated)"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Deprecated"}),": Use ",(0,s.jsx)(n.code,{children:"Analytics.sendBAEvent()"})," via the scripting object instead."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Legacy helper to push BA events to the GTM data layer:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { sendBAEvent } from '@elliemae/pui-app-sdk';\n\nsendBAEvent({\n data: { eventName: 'button_click', eventCategory: 'user_interaction' },\n self: true, // true = push to own dataLayer; false = send to host app\n});\n"})}),"\n",(0,s.jsx)(n.h3,{id:"fetchusersettings",children:"fetchUserSettings"}),"\n",(0,s.jsxs)(n.p,{children:["Retrieve user settings from the API. Called automatically during ",(0,s.jsx)(n.code,{children:"authorize()"}),", but available for manual use:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { fetchUserSettings } from '@elliemae/pui-app-sdk';\n\nconst settings = await fetchUserSettings({\n userName: 'jdoe',\n isConsumerUser: false,\n});\n"})}),"\n",(0,s.jsx)(n.h2,{id:"micro-frontends",children:"Micro-Frontends"}),"\n",(0,s.jsx)(n.h3,{id:"hosting-micro-frontends",children:"Hosting Micro-Frontends"}),"\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"GuestMicroApp"})," to embed child applications:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { GuestMicroApp, history } from '@elliemae/pui-app-sdk';\n\n// Simple guest micro-app component\nconst PricingMicroApp = () => <GuestMicroApp id=\"pricing\" history={history} />;\n\nexport default PricingMicroApp;\n"})}),"\n",(0,s.jsx)(n.h3,{id:"micro-frontend-configuration",children:"Micro-Frontend Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["Define micro-apps in your ",(0,s.jsx)(n.code,{children:"app.config.json"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "microFrontendApps": {\n "pricing": {\n "name": "Pricing",\n "hostUrl": "./pricing",\n "development": {\n "files": ["index.js"]\n },\n "production": {\n "files": ["index.js"]\n }\n },\n "services": {\n "name": "Services",\n "hostUrl": "./services",\n "mode": "development",\n "development": {\n "files": ["index.dev.js", "index.css"]\n },\n "production": {\n "files": ["index.js", "index.css"]\n }\n }\n }\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"navigation--history-modes",children:"Navigation & History Modes"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"GuestMicroApp"})," component supports two history modes that control how the guest app's URL is managed. The mode is determined by the ",(0,s.jsx)(n.code,{children:"useParentHistory"})," flag in the guest app's ",(0,s.jsx)(n.code,{children:"app.config.json"}),"."]}),"\n",(0,s.jsxs)(n.h4,{id:"useparenthistory-true-default--shared-history",children:[(0,s.jsx)(n.code,{children:"useParentHistory: true"})," (default) \u2014 Shared History"]}),"\n",(0,s.jsx)(n.p,{children:"The guest app shares the host's browser history. Route changes in the guest are reflected in the host's URL bar and vice versa."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host URL bar: https://host.example.com/auth-setup/loan/123\n \u2514\u2500 basename \u2500\u2518\u2514 guest route \u2518\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Host app (parent):"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { GuestMicroApp, history } from '@elliemae/pui-app-sdk';\n\nconst LoanApp = () => <GuestMicroApp id=\"loanapp\" history={history} />;\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Guest app config"})," (",(0,s.jsx)(n.code,{children:"app.config.json"}),"):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "useParentHistory": true\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"When to use:"})," The guest app is the primary content area and its routes should be bookmarkable / shareable via the host's URL."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.h4,{id:"useparenthistory-false--independent-history",children:[(0,s.jsx)(n.code,{children:"useParentHistory: false"})," \u2014 Independent History"]}),"\n",(0,s.jsx)(n.p,{children:"The guest app runs inside an iframe with its own browser history, independent of the host's URL. The host's URL bar does not change when the guest navigates internally."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host URL bar: https://host.example.com/auth-setup (stays fixed)\nIframe URL: https://guest.example.com/dashboard (managed independently)\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Guest app config"})," (",(0,s.jsx)(n.code,{children:"app.config.json"}),"):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "useParentHistory": false\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"When to use:"})," The guest app should manage its own navigation without affecting the host's URL \u2014 e.g., an embedded tool, modal-like workflow, or self-contained feature."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h4,{id:"setting-an-initial-route-from-the-host",children:"Setting an Initial Route from the Host"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"initialRoute"})," prop lets the host app control which route the guest app lands on. This works with both history modes."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Scenario 1: Shared history with initial route"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'// Host navigates guest to /auth-setup/loan/123 on load\nconst LoanApp = () => (\n <GuestMicroApp\n id="loanapp"\n history={history}\n initialRoute="/auth-setup/loan/123"\n />\n);\n'})}),"\n",(0,s.jsx)(n.p,{children:"The guest app receives the parent's history, and the host's URL is set to the initial route."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Scenario 2: Independent history with initial route"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'// Host tells the guest to start at /app/dashboard\nconst MyApp = () => (\n <GuestMicroApp id="myapp" history={history} initialRoute="/app/dashboard" />\n);\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The SDK defers the route push to the ",(0,s.jsx)(n.code,{children:"mount()"})," phase (after the iframe is stable but before React renders), so the guest's React Router sees the correct URL on its first render \u2014 no flash of the default landing page."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note:"})," The ",(0,s.jsx)(n.code,{children:"initialRoute"})," value should be the full path including the guest app's basename (e.g., ",(0,s.jsx)(n.code,{children:"/app/dashboard"}),", not just ",(0,s.jsx)(n.code,{children:"/dashboard"}),"). The SDK pushes this path to the browser history directly, and React Router matches it against its configured ",(0,s.jsx)(n.code,{children:"basename"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h4,{id:"quick-reference",children:"Quick Reference"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Scenario"}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.code,{children:"useParentHistory"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.code,{children:"initialRoute"})}),(0,s.jsx)(n.th,{children:"Behavior"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Guest shares host URL"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"true"})," (default)"]}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:"omitted"})}),(0,s.jsx)(n.td,{children:"Guest routes reflected in host URL bar"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Guest shares host URL, starts at specific page"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"true"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:'"/app/details/42"'})}),(0,s.jsx)(n.td,{children:"Host URL set to initial route on load"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Guest has own URL space"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:"omitted"})}),(0,s.jsx)(n.td,{children:"Guest loads at its default route, host URL unchanged"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Guest has own URL space, starts at specific page"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:'"/app/dashboard"'})}),(0,s.jsxs)(n.td,{children:["Guest starts at ",(0,s.jsx)(n.code,{children:"/dashboard"}),", host URL unchanged"]})]})]})]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.h4,{id:"guest-app-appconfigjson-example",children:["Guest App ",(0,s.jsx)(n.code,{children:"app.config.json"})," Example"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "appId": "myapp",\n "useParentHistory": false,\n "activeEnv": "dev",\n "microFrontendApps": {}\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"micro-frontend-host-api",children:"Micro-Frontend Host API"}),"\n",(0,s.jsx)(n.p,{children:"The SDK also provides host-side APIs for apps that manage guest micro-apps."}),"\n",(0,s.jsx)(n.h4,{id:"selfinitialize-is-required",children:"selfInitialize is Required"}),"\n",(0,s.jsxs)(n.p,{children:["Both ",(0,s.jsx)(n.code,{children:"CMicroApp"})," and ",(0,s.jsx)(n.code,{children:"CMicroAppHost"})," now require ",(0,s.jsx)(n.code,{children:"selfInitialize: true"})," in their constructor params. Calling ",(0,s.jsx)(n.code,{children:"getInstance()"})," without this flag logs a deprecation warning at runtime:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"CMicroApp.getInstance() called without selfInitialize: true \u2014 this legacy mode\nis deprecated. Pass { selfInitialize: true } and use initialize() instead.\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The legacy mode (where the constructor auto-chains ",(0,s.jsx)(n.code,{children:"loadAppConfig \u2192 getAppBridge \u2192 onInit"}),") is still functional but will be removed in a future major release. Migrate by adding the flag and calling ",(0,s.jsx)(n.code,{children:"initialize()"})," explicitly:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// Before (deprecated \u2014 triggers warning)\nconst app = CMicroApp.getInstance({ logger, onInit });\n\n// After\nconst app = CMicroApp.getInstance({ logger, selfInitialize: true, onInit });\nawait app.initialize();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This applies to both hosts and guests. The explicit ",(0,s.jsx)(n.code,{children:"initialize()"})," call gives you control over when config loading and host discovery happen, making the startup sequence predictable and easier to debug."]}),"\n",(0,s.jsx)(n.h4,{id:"cmicroapphost-deprecated",children:"CMicroAppHost (Deprecated)"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Deprecated"})," \u2014 Use ",(0,s.jsx)(n.code,{children:"CMicroApp"})," with ",(0,s.jsx)(n.code,{children:"selfInitialize: true"})," instead. ",(0,s.jsx)(n.code,{children:"CMicroApp"})," now supports both guest and host use cases. ",(0,s.jsx)(n.code,{children:"CMicroAppHost"})," will be removed in a future major release."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"CMicroAppHost"})," is still available for backward compatibility but new apps should use ",(0,s.jsx)(n.code,{children:"CMicroApp"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// Deprecated\nimport { CMicroAppHost } from '@elliemae/pui-app-sdk';\nconst host = CMicroAppHost.getInstance({ logger, onInit });\n\n// Use instead\nimport { CMicroApp } from '@elliemae/pui-app-sdk';\nconst app = CMicroApp.getInstance({ logger, selfInitialize: true, onInit });\nawait app.initialize();\n"})}),"\n",(0,s.jsx)(n.h4,{id:"enablereactappforhostintegration",children:"enableReactAppForHostIntegration"}),"\n",(0,s.jsxs)(n.p,{children:["Shorthand to create a ",(0,s.jsx)(n.code,{children:"CMicroApp"})," (guest) instance for host-integration scenarios \u2014 useful when the host wants to render the guest inline:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { enableReactAppForHostIntegration } from '@elliemae/pui-app-sdk';\n\nconst app = enableReactAppForHostIntegration({ onInit, onMount });\n"})}),"\n",(0,s.jsx)(n.h4,{id:"getmicrofrontendappconfig",children:"getMicroFrontEndAppConfig"}),"\n",(0,s.jsxs)(n.p,{children:["Read a micro-app's resolved configuration from ",(0,s.jsx)(n.code,{children:"app.config.json"}),". Returns the merged development/production config with absolute URLs:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getMicroFrontEndAppConfig } from '@elliemae/pui-app-sdk';\n\nconst config = getMicroFrontEndAppConfig({ id: 'pricing' });\n// config.hostUrl, config.files, config.name, etc.\n"})}),"\n",(0,s.jsx)(n.h4,{id:"getnavigationlinks",children:"getNavigationLinks"}),"\n",(0,s.jsxs)(n.p,{children:["Build navigation links from all micro-apps defined in ",(0,s.jsx)(n.code,{children:"app.config.json"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getNavigationLinks } from '@elliemae/pui-app-sdk';\n\nconst links = getNavigationLinks();\n// [{ id: 'pricing', name: 'Pricing', path: '/pricing' }, ...]\n"})}),"\n",(0,s.jsx)(n.h4,{id:"getlogger",children:"getLogger"}),"\n",(0,s.jsx)(n.p,{children:"Returns the logger from whichever micro-app context is active (host or guest):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getLogger } from '@elliemae/pui-app-sdk';\n\nconst logger = getLogger();\nlogger.info('Application ready');\n"})}),"\n",(0,s.jsx)(n.h4,{id:"deprecated-components",children:"Deprecated Components"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"MicroApp"})," and ",(0,s.jsx)(n.code,{children:"MicroIFrameApp"})," are deprecated. Use ",(0,s.jsx)(n.code,{children:"GuestMicroApp"})," instead:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// Deprecated \u2014 will be removed in a future release\nimport { MicroApp, MicroIFrameApp } from '@elliemae/pui-app-sdk';\n\n// Use instead\nimport { GuestMicroApp } from '@elliemae/pui-app-sdk';\n"})}),"\n",(0,s.jsx)(n.h3,{id:"guest-initiated-loading",children:"Guest-Initiated Loading"}),"\n",(0,s.jsxs)(n.p,{children:["By default, App Bridge drives the guest lifecycle: it calls ",(0,s.jsx)(n.code,{children:"init()"}),", then ",(0,s.jsx)(n.code,{children:"mount()"}),". With ",(0,s.jsx)(n.strong,{children:"guest-initiated loading"}),", the guest drives its own lifecycle by calling ",(0,s.jsx)(n.code,{children:"initialize()"})," \u2014 the bridge only handles iframe creation and script injection."]}),"\n",(0,s.jsx)(n.h4,{id:"enabling-self-initialize-in-appconfigjson",children:"Enabling Self-Initialize in app.config.json"}),"\n",(0,s.jsxs)(n.p,{children:["Add ",(0,s.jsx)(n.code,{children:'"selfInitialize": true'})," to the guest entry in the ",(0,s.jsx)(n.strong,{children:"host's"})," ",(0,s.jsx)(n.code,{children:"app.config.json"}),". The ",(0,s.jsx)(n.code,{children:"GuestMicroApp"})," component reads this flag automatically and passes it to App Bridge \u2014 no changes to JSX are needed."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "microFrontendApps": {\n "loanapp": {\n "name": "Loan",\n "hostUrl": "https://encompass.d1.ice.com/loan",\n "selfInitialize": true,\n "production": {\n "files": ["runtime~app.js", "vendors.js", "emui.js", "app.js"]\n }\n }\n }\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"<GuestMicroApp>"})," component works exactly the same \u2014 no prop changes required:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"import { GuestMicroApp } from '@elliemae/pui-app-sdk';\n\n<GuestMicroApp\n id=\"loanapp\"\n history={browserHistory}\n homeRoute=\"/home\"\n onLoadComplete={(instanceId) => console.log('loaded', instanceId)}\n/>;\n"})}),"\n",(0,s.jsx)(n.h4,{id:"setting-up-a-self-initializing-guest",children:"Setting Up a Self-Initializing Guest"}),"\n",(0,s.jsxs)(n.p,{children:["In the guest app, pass ",(0,s.jsx)(n.code,{children:"selfInitialize: true"})," when creating the ",(0,s.jsx)(n.code,{children:"CMicroApp"})," instance:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { CMicroApp } from '@elliemae/pui-app-sdk';\n\nconst app = CMicroApp.getInstance({\n logger,\n onInit,\n onMount,\n onUnmount,\n selfInitialize: true,\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Then call ",(0,s.jsx)(n.code,{children:"initialize()"})," in your app's entry point:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const params = await app.initialize();\n// params contains moduleId, hostUrl, homeRoute, theme, history, etc.\n// At this point onInit has been called and the app is ready to render.\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"initialize()"})," discovers the host automatically and calls your ",(0,s.jsx)(n.code,{children:"onInit"})," callback. If the host registered a module scripting object, ",(0,s.jsx)(n.code,{children:"initialize()"})," fetches its parameters (home route, theme, history) and applies them. If no module SO is registered, ",(0,s.jsx)(n.code,{children:"initialize()"})," logs a warning and proceeds \u2014 the guest can still render using its own ",(0,s.jsx)(n.code,{children:"app.config.json"})," values."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Use guest-initiated loading when the guest app needs to control its own startup sequence \u2014 for example, when it must load configuration or authenticate before rendering."})}),"\n",(0,s.jsx)(n.h4,{id:"standalone-mode",children:"Standalone Mode"}),"\n",(0,s.jsxs)(n.p,{children:["When the guest runs outside an iframe (e.g. during local development), ",(0,s.jsx)(n.code,{children:"initialize()"})," detects standalone mode and skips host discovery. It loads ",(0,s.jsx)(n.code,{children:"app.config.json"})," and calls ",(0,s.jsx)(n.code,{children:"onInit"})," so the app can render normally."]}),"\n",(0,s.jsxs)(n.h3,{id:"host-discovery-windowemuigethost",children:["Host Discovery (",(0,s.jsx)(n.code,{children:"window.emui.getHost"}),")"]}),"\n",(0,s.jsxs)(n.p,{children:["After the SDK discovers the host \u2014 whether via App Bridge (",(0,s.jsx)(n.code,{children:"window.emui.__host"}),") or SSF connect \u2014 it exposes a convenience accessor on ",(0,s.jsx)(n.code,{children:"window.emui"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const host = window.emui.getHost();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This works in both the ",(0,s.jsx)(n.strong,{children:"self-initialize"})," path (",(0,s.jsx)(n.code,{children:"initialize()"}),") and the ",(0,s.jsx)(n.strong,{children:"host-initiated"})," path (",(0,s.jsx)(n.code,{children:"init()"}),"). The function returns the discovered host reference, or ",(0,s.jsx)(n.code,{children:"null"})," if no host has been found yet."]}),"\n",(0,s.jsx)(n.h4,{id:"sdk-based-guests",children:"SDK-based guests"}),"\n",(0,s.jsxs)(n.p,{children:["For guests that use ",(0,s.jsx)(n.code,{children:"CMicroApp"}),", prefer the instance method \u2014 it returns the same reference:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const app = CMicroApp.getInstance();\nconst host = app.getHost();\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"window.emui.getHost()"})," is most useful for plain JS module guests (CDN scripts) that don't import the SDK:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",children:"const host = window.emui.getHost();\nconst moduleSO = await host.getObject('module');\nconst params = await moduleSO.getParameters();\n"})}),"\n",(0,s.jsx)(n.h4,{id:"availability",children:"Availability"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Scenario"}),(0,s.jsxs)(n.th,{children:["When ",(0,s.jsx)(n.code,{children:"getHost()"})," is set"]})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"App Bridge iframe guests"}),(0,s.jsxs)(n.td,{children:["Immediately when the iframe is created (set by the bridge), then replaced by the SDK after ",(0,s.jsx)(n.code,{children:"init()"})," or ",(0,s.jsx)(n.code,{children:"initialize()"})," completes"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Self-initializing guests"}),(0,s.jsxs)(n.td,{children:["After ",(0,s.jsx)(n.code,{children:"initialize()"})," discovers the host"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Host-initiated guests"}),(0,s.jsxs)(n.td,{children:["After ",(0,s.jsx)(n.code,{children:"init()"})," completes"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Standalone mode (local dev)"}),(0,s.jsxs)(n.td,{children:["Not set \u2014 returns ",(0,s.jsx)(n.code,{children:"undefined"})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"module-scripting-object",children:"Module Scripting Object"}),"\n",(0,s.jsxs)(n.p,{children:["The SDK provides helpers to create a ",(0,s.jsx)(n.strong,{children:"module"})," scripting object for guests that need host-provided parameters. This is optional \u2014 a self-initializing guest can work without it if it doesn't need parameters from the host."]}),"\n",(0,s.jsx)(n.p,{children:"Use a module SO when:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Shared single-page routing"})," \u2014 the host passes its ",(0,s.jsx)(n.code,{children:"history"})," object so route changes in the guest update the host's URL bar and vice versa (deep-linking, back/forward navigation across micro-apps)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Consistent theming"})," \u2014 the host passes its styled-components ",(0,s.jsx)(n.code,{children:"theme"})," so the guest renders with the same design tokens"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Initial route"})," \u2014 the host tells the guest which page to open on launch (e.g. ",(0,s.jsx)(n.code,{children:"/loans/123"}),") without the guest flashing its default landing page first"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Custom capabilities"})," \u2014 the host can expose additional parameters (permissions, tenant context, feature flags) that the guest reads at startup"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"createguestmodule",children:"createGuestModule"}),"\n",(0,s.jsxs)(n.p,{children:["Create a module scripting object for a guest app. It reads ",(0,s.jsx)(n.code,{children:"hostUrl"}),", ",(0,s.jsx)(n.code,{children:"manifestPath"}),", and ",(0,s.jsx)(n.code,{children:"homeRoute"})," from ",(0,s.jsx)(n.code,{children:"app.config.json"})," and merges them with host-provided values (theme, history, initialRoute)."]}),"\n",(0,s.jsxs)(n.p,{children:["Always register scripting objects through ",(0,s.jsx)(n.code,{children:"CMicroApp"})," rather than directly on the app bridge \u2014 this ensures the object is added to both the App Bridge and the SSF Host:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { CMicroApp, createGuestModule } from '@elliemae/pui-app-sdk';\n\n// Host app \u2014 must use selfInitialize: true\nconst app = CMicroApp.getInstance({ selfInitialize: true, logger, onInit });\nawait app.initialize();\n\nconst moduleSO = createGuestModule('loanapp', {\n theme: myTheme,\n history: appHistory,\n});\n\napp.addScriptingObject(moduleSO, { guestId: 'loanapp' });\n"})}),"\n",(0,s.jsx)(n.h4,{id:"buildmoduleparams",children:"buildModuleParams"}),"\n",(0,s.jsx)(n.p,{children:"If you need to build the parameters object without creating a scripting object (e.g. for testing or custom SO implementations):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { buildModuleParams } from '@elliemae/pui-app-sdk';\n\nconst params = buildModuleParams('loanapp', {\n theme: myTheme,\n history: appHistory,\n initialRoute: '/loans/123',\n});\n// { moduleId: 'loanapp', hostUrl: '...', homeRoute: '/', theme: ..., history: ..., ... }\n"})}),"\n",(0,s.jsx)(n.h4,{id:"guestmodule-class",children:"GuestModule Class"}),"\n",(0,s.jsxs)(n.p,{children:["For advanced use cases where you need to subclass or override methods beyond what ",(0,s.jsx)(n.code,{children:"createGuestModule"})," overrides support:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { CMicroApp, GuestModule } from '@elliemae/pui-app-sdk';\n\nclass CustomModule extends GuestModule {\n async getCapabilities() {\n return { supportsCustomEvents: true };\n }\n}\n\nconst app = CMicroApp.getInstance({ selfInitialize: true, logger, onInit });\nawait app.initialize();\n\nconst mod = new CustomModule('loanapp', { theme: myTheme });\napp.addScriptingObject(mod, { guestId: 'loanapp' });\n"})}),"\n",(0,s.jsx)(n.h3,{id:"automatic-manifest-warm-up",children:"Automatic Manifest Warm-Up"}),"\n",(0,s.jsxs)(n.p,{children:["When ",(0,s.jsx)(n.code,{children:"getAppBridge()"})," is called for the first time, the SDK automatically calls ",(0,s.jsx)(n.code,{children:"warmUp()"})," for every micro-app listed in ",(0,s.jsx)(n.code,{children:"microFrontendApps"}),". This pre-fetches their manifests in the background so that subsequent ",(0,s.jsx)(n.code,{children:"openApp()"})," calls start faster."]}),"\n",(0,s.jsx)(n.p,{children:"No code changes are needed \u2014 this happens automatically when your app initializes the bridge."}),"\n",(0,s.jsx)(n.h2,{id:"scripting-objects",children:"Scripting Objects"}),"\n",(0,s.jsx)(n.h3,{id:"adding-scripting-objects",children:"Adding Scripting Objects"}),"\n",(0,s.jsx)(n.p,{children:"Access and share scripting objects between parent and child micro-apps:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { CMicroApp } from '@elliemae/pui-app-sdk';\nimport { ScriptingObjectTypes } from '@elliemae/pui-scripting-object';\n\nconst addObject = async (\n app: CMicroApp,\n objectName: keyof ScriptingObjectTypes,\n) => {\n try {\n const so = await app.getObject(objectName);\n if (so) {\n app.addScriptingObject(so);\n }\n } catch (error) {\n // Handle error\n }\n};\n\n// Get scripting objects from parent and expose to child\nexport const addScriptingObjects = async () => {\n const app = CMicroApp.getInstance();\n await Promise.all([\n addObject(app, 'analytics'),\n addObject(app, 'application'),\n addObject(app, 'auth'),\n addObject(app, 'http'),\n addObject(app, 'loan'),\n ]);\n};\n\n// Call during app initialization\nexport const onInit: OnInitCallback = ({ history, homeRoute }) => {\n // ... other initialization\n addScriptingObjects().catch(() => {\n // Handle error\n });\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-scripting-objects-in-components",children:"Using Scripting Objects in Components"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { CMicroApp } from '@elliemae/pui-app-sdk';\nimport { useFormContext } from 'react-hook-form';\n\nconst listenToLoanSyncEvent = async (setValue) => {\n const app = CMicroApp.getInstance();\n const loan = await app.getObject('loan');\n\n if (loan) {\n const subscriptionId = app.subscribe({\n eventId: 'loan.sync',\n callback: ({ eventParams }) => {\n const { firstname, lastname } = eventParams;\n setValue('firstname', firstname);\n setValue('lastname', lastname);\n\n // Unsubscribe after handling\n app.unsubscribe({\n eventId: 'loan.sync',\n token: subscriptionId,\n });\n },\n });\n }\n};\n\nexport const FormComponent = () => {\n const { setValue } = useFormContext();\n\n useEffect(() => {\n listenToLoanSyncEvent(setValue).catch(() => {\n // Handle error\n });\n }, [setValue]);\n\n return <div>{/* form fields */}</div>;\n};\n"})}),"\n",(0,s.jsx)(n.h2,{id:"wait-messages",children:"Wait Messages"}),"\n",(0,s.jsx)(n.p,{children:"Display loading indicators with customizable wait messages:"}),"\n",(0,s.jsx)(n.h3,{id:"using-waitmessage-component",children:"Using WaitMessage Component"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { waitMessageAction, useAppDispatch } from '@elliemae/pui-app-sdk';\n\n// Show/hide wait message from anywhere in your app\nfunction MyComponent() {\n const dispatch = useAppDispatch();\n\n const handleLoadData = async () => {\n // Show wait message\n dispatch(waitMessageAction.open('Loading data...', true));\n\n try {\n await fetchData();\n } finally {\n // Hide wait message\n dispatch(waitMessageAction.close());\n }\n };\n\n return <button onClick={handleLoadData}>Load Data</button>;\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"wait-message-props",children:"Wait Message Props"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"size"}),": ",(0,s.jsx)(n.code,{children:"'xs' | 'sm' | 'md' | 'lg' | 'xl'"})," - Size of the spinner"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"color"}),": ",(0,s.jsx)(n.code,{children:"'light' | 'dark'"})," - Color theme"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"showText"}),": ",(0,s.jsx)(n.code,{children:"boolean"})," - Show loading text"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"withTooltip"}),": ",(0,s.jsx)(n.code,{children:"boolean"})," - Show as tooltip"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tooltipStartPlacementPreference"}),": Tooltip placement"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"navigation-prompts",children:"Navigation Prompts"}),"\n",(0,s.jsx)(n.p,{children:"Prompt users before navigating away from unsaved changes:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n NavigationPrompt,\n NavigationPromptActions,\n useAppDispatch,\n} from '@elliemae/pui-app-sdk';\n\nfunction FormPage() {\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const [showPrompt, setShowPrompt] = useState(false);\n const dispatch = useAppDispatch();\n\n // Listen for navigation prompt actions\n useEffect(() => {\n const handleConfirm = () => {\n // Save data and proceed\n saveData();\n setShowPrompt(false);\n };\n\n const handleCancel = () => {\n // Proceed without saving\n setShowPrompt(false);\n };\n\n // Subscribe to actions\n return () => {\n // Cleanup\n };\n }, []);\n\n // Show prompt when navigating with unsaved changes\n const handleNavigation = () => {\n if (hasUnsavedChanges) {\n setShowPrompt(true);\n }\n };\n\n return (\n <>\n <NavigationPrompt open={showPrompt} />\n {/* Your form */}\n </>\n );\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"dispatch-navigation-prompt-actions",children:"Dispatch Navigation Prompt Actions"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { NavigationPromptActions } from '@elliemae/pui-app-sdk';\n\n// User confirms to save and continue\ndispatch({ type: NavigationPromptActions.CONFIRM });\n\n// User cancels or continues without saving\ndispatch({ type: NavigationPromptActions.CANCEL });\n"})}),"\n",(0,s.jsx)(n.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,s.jsx)(n.h3,{id:"global-error-toast",children:"Global Error Toast"}),"\n",(0,s.jsx)(n.p,{children:"Display error messages using the global error toast:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { error, useAppDispatch } from '@elliemae/pui-app-sdk';\n\n// Dispatch errors from anywhere in your app\nfunction MyComponent() {\n const dispatch = useAppDispatch();\n\n const handleError = async () => {\n try {\n await riskyOperation();\n } catch (err) {\n dispatch(\n error.set({\n messageText: 'Operation failed',\n description: (err as Error).message,\n }),\n );\n }\n };\n\n return <button onClick={handleError}>Execute</button>;\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"clear-errors",children:"Clear Errors"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { error } from '@elliemae/pui-app-sdk';\n\n// Clear error state\ndispatch(error.clear());\n"})}),"\n",(0,s.jsx)(n.h2,{id:"aria-live-messages",children:"ARIA Live Messages"}),"\n",(0,s.jsx)(n.p,{children:"Announce messages to screen readers for accessibility:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { ariaLive, useAppDispatch } from '@elliemae/pui-app-sdk';\n\nfunction MyComponent() {\n const dispatch = useAppDispatch();\n\n const announceSuccess = () => {\n dispatch(\n ariaLive.announce({\n message: 'Data saved successfully',\n ariaLive: 'polite', // or 'assertive' for urgent messages\n id: 'save-success',\n }),\n );\n };\n\n return <button onClick={announceSuccess}>Save</button>;\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"decorators",children:"Decorators"}),"\n",(0,s.jsx)(n.p,{children:"The SDK provides TypeScript decorators for common patterns:"}),"\n",(0,s.jsx)(n.h3,{id:"function-decorators",children:"Function Decorators"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { decorators } from '@elliemae/pui-app-sdk';\n\nconst {\n CacheUntilResolved,\n Debounce,\n Throttle,\n Memoize,\n MemoizeAsync,\n RetryAsync,\n AsyncSingleExecution,\n QueueTask,\n} = decorators.function;\n\nclass DataService {\n // Cache async results until promise resolves\n @CacheUntilResolved\n async fetchData() {\n return await api.getData();\n }\n\n // Debounce method calls\n @Debounce(500)\n onSearchInput(query: string) {\n this.performSearch(query);\n }\n\n // Throttle method calls\n @Throttle(1000)\n onScroll() {\n this.loadMoreData();\n }\n\n // Memoize synchronous results\n @Memoize\n calculateTotal(items: Item[]) {\n return items.reduce((sum, item) => sum + item.price, 0);\n }\n\n // Memoize async results\n @MemoizeAsync\n async fetchUserData(userId: string) {\n return await api.getUser(userId);\n }\n\n // Retry failed async operations\n @RetryAsync(3, 1000) // 3 retries, 1000ms delay\n async unreliableOperation() {\n return await api.flakeyEndpoint();\n }\n\n // Ensure only one execution at a time\n @AsyncSingleExecution\n async saveData() {\n return await api.save();\n }\n\n // Queue tasks for sequential execution\n @QueueTask\n async processItem(item: Item) {\n return await api.process(item);\n }\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"class-decorators",children:"Class Decorators"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { decorators } from '@elliemae/pui-app-sdk';\n\nconst { Singleton, Mixins } = decorators.class;\n\n// Ensure only one instance exists\n@Singleton\nclass ConfigService {\n private config: Config;\n\n constructor() {\n this.config = loadConfig();\n }\n}\n\n// Mix multiple classes\n@Mixins(LoggingMixin, CachingMixin)\nclass DataManager {\n // Inherits methods from both mixins\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"advanced-state-selectors",children:"Advanced State Selectors"}),"\n",(0,s.jsx)(n.h3,{id:"using-usestateselector",children:"Using useStateSelector"}),"\n",(0,s.jsx)(n.p,{children:"Select specific fields from state with better performance:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n useStateSelector,\n useStateSelectorShallow,\n getSelectField,\n} from '@elliemae/pui-app-sdk';\n\n// In your slice file\nexport const selectUserState = getSelectField('user');\n\n// In your component\nfunction UserProfile() {\n // Select single field\n const userName = useStateSelector(selectUserState, 'profile.name', {\n defaultValue: 'Guest',\n });\n\n // Select multiple fields\n const [email, phone, address] = useStateSelector(\n selectUserState,\n ['profile.email', 'profile.phone', 'profile.address'],\n { defaultValue: ['', '', ''] },\n );\n\n // Select nested objects\n const settings = useStateSelector(selectUserState, 'preferences.settings', {\n defaultValue: {},\n });\n\n return <div>{userName}</div>;\n}\n\n// Use shallow equality for better performance\nfunction UserSettings() {\n const settings = useStateSelectorShallow(selectUserState, 'preferences', {\n defaultValue: {},\n });\n\n return <div>{/* render settings */}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"responsive-design",children:"Responsive Design"}),"\n",(0,s.jsx)(n.h3,{id:"media-query-hook",children:"Media Query Hook"}),"\n",(0,s.jsx)(n.p,{children:"Respond to media query changes:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useMediaQueryList } from '@elliemae/pui-app-sdk';\n\nfunction ResponsiveComponent() {\n const deviceType = useMediaQueryList(\n [\n '(max-width: 767px)',\n '(min-width: 768px) and (max-width: 1023px)',\n '(min-width: 1024px)',\n ],\n ['mobile', 'tablet', 'desktop'],\n 'desktop', // default value\n );\n\n return (\n <div>\n {deviceType === 'mobile' && <MobileLayout />}\n {deviceType === 'tablet' && <TabletLayout />}\n {deviceType === 'desktop' && <DesktopLayout />}\n </div>\n );\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"environment--url-utilities",children:"Environment & URL Utilities"}),"\n",(0,s.jsx)(n.h3,{id:"environment-detection",children:"Environment Detection"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { isProd, isCIBuild } from '@elliemae/pui-app-sdk';\n\nif (isProd()) {\n // NODE_ENV === 'production'\n}\n\nif (isCIBuild()) {\n // CI === 'true' (running in CI pipeline)\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"history-instances",children:"History Instances"}),"\n",(0,s.jsx)(n.p,{children:"The SDK exports two pre-created history instances:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { history, memoryHistory } from '@elliemae/pui-app-sdk';\n\n// history \u2014 browser history, used by default for routing\n// memoryHistory \u2014 in-memory history, useful for testing or non-browser environments\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"memoryHistory"})," in tests to avoid browser URL side-effects:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { memoryHistory } from '@elliemae/pui-app-sdk';\n\nmemoryHistory.push('/test-route');\n"})}),"\n",(0,s.jsx)(n.h3,{id:"removedoubleslash",children:"removeDoubleSlash"}),"\n",(0,s.jsxs)(n.p,{children:["Collapse accidental double slashes in URLs (preserving the protocol ",(0,s.jsx)(n.code,{children:"://"}),"):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { removeDoubleSlash } from '@elliemae/pui-app-sdk';\n\nremoveDoubleSlash('https://example.com//api//v1');\n// \u2192 'https://example.com/api/v1'\n"})}),"\n",(0,s.jsx)(n.h3,{id:"themes",children:"Themes"}),"\n",(0,s.jsx)(n.p,{children:"Available theme constants:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { Themes } from '@elliemae/pui-app-sdk';\n\n// Themes.EM \u2192 'em'\n// Themes.CORP_COOL \u2192 'corpcool'\n"})}),"\n",(0,s.jsx)(n.h2,{id:"security-utilities",children:"Security Utilities"}),"\n",(0,s.jsx)(n.h3,{id:"pii-redaction",children:"PII Redaction"}),"\n",(0,s.jsx)(n.p,{children:"Automatically redact personally identifiable information from logs:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { redactPii } from '@elliemae/pui-app-sdk';\n\nconst sensitiveData = {\n name: 'John Doe',\n email: 'john@example.com',\n phone: '555-123-4567',\n ssn: '123-45-6789',\n creditCard: '4532-1234-5678-9010',\n address: '123 Main St, Apt 4B',\n zipcode: '12345-6789',\n};\n\nconst redacted = redactPii(sensitiveData);\nconsole.log(redacted);\n// {\n// name: 'John Doe',\n// email: '****',\n// phone: '****',\n// ssn: '****',\n// creditCard: '****',\n// address: '****',\n// zipcode: '****',\n// }\n\n// Use when logging errors or data\nlogger.error(redactPii({ message: 'Error', data: sensitiveData }));\n"})}),"\n",(0,s.jsx)(n.h2,{id:"listener-middleware",children:"Listener Middleware"}),"\n",(0,s.jsx)(n.p,{children:"Use Redux Toolkit listener middleware for side effects:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n startSideEffect,\n createSideEffect,\n removeSideEffect,\n clearSideEffects,\n} from '@elliemae/pui-app-sdk';\nimport { resources } from './data/resources';\n\n// Start listening for actions\nstartSideEffect({\n actionCreator: resources.get,\n effect: async (action, listenerApi) => {\n // Access state\n const state = listenerApi.getState();\n\n // Call API\n const data = await fetchResources();\n\n // Dispatch success action\n listenerApi.dispatch(resources.getSuccess(data));\n },\n});\n\n// Create a reusable listener\nconst listener = createSideEffect({\n actionCreator: resources.create,\n effect: async (action, listenerApi) => {\n await createResource(action.payload);\n listenerApi.dispatch(resources.get());\n },\n});\n\n// Remove a listener\nremoveSideEffect(listener);\n\n// Clear all listeners\nclearSideEffects();\n"})}),"\n",(0,s.jsx)(n.h2,{id:"session-management",children:"Session Management"}),"\n",(0,s.jsx)(n.h3,{id:"session-timeout-handling",children:"Session Timeout Handling"}),"\n",(0,s.jsx)(n.p,{children:"The SDK provides comprehensive session timeout management with warning and expiry callbacks:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n subscribeToSessionExpiryWarning,\n subscribeToSessionExpiry,\n subscribeToResetSession,\n resetUserIdleTime,\n trackActivity,\n} from '@elliemae/pui-app-sdk';\n\n// Subscribe to session expiry warning (shown before session expires)\nsubscribeToSessionExpiryWarning((warningNotifiedAt) => {\n console.log('Session will expire soon!', warningNotifiedAt);\n // Show warning modal to user\n});\n\n// Subscribe to session expiry event\nsubscribeToSessionExpiry(() => {\n console.log('Session has expired');\n // Redirect to login or handle session expiry\n});\n\n// Subscribe to session reset events\nsubscribeToResetSession((resetWarningModal) => {\n if (resetWarningModal) {\n // Close warning modal if it's open\n }\n});\n\n// Manually reset user idle time (e.g., on user activity)\nresetUserIdleTime(true); // Pass true to reset warning modal\n\n// Track user activity (automatically resets idle timer)\ntrackActivity();\n"})}),"\n",(0,s.jsx)(n.h3,{id:"session-ui-components",children:"Session UI Components"}),"\n",(0,s.jsx)(n.h4,{id:"sessiontimeout",children:"SessionTimeout"}),"\n",(0,s.jsxs)(n.p,{children:["A self-contained component that monitors idle time, displays a session-expiry warning modal, and dispatches ",(0,s.jsx)(n.code,{children:"logout.confirm()"})," when the session expires. Place it once in your app root:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { SessionTimeout } from '@elliemae/pui-app-sdk';\n\nconst Application = () => (\n <AppRoot store={store} history={history} theme={theme} manageSession>\n <SessionTimeout />\n <AppRoutes />\n </AppRoot>\n);\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"AppRoot"})," with ",(0,s.jsx)(n.code,{children:"manageSession"})," renders ",(0,s.jsx)(n.code,{children:"SessionTimeout"})," automatically. Add it manually only when assembling your own root layout."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"waitmessage",children:"WaitMessage"}),"\n",(0,s.jsxs)(n.p,{children:["A full-screen loading indicator controlled by ",(0,s.jsx)(n.code,{children:"waitMessageAction"})," Redux state:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'import { WaitMessage } from \'@elliemae/pui-app-sdk\';\n\n// Typically placed in AppRoot layout \u2014 shown/hidden via Redux\n<WaitMessage size="xl" color="light" showText />;\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"WaitMessage"})," component reads its open/close state from Redux. Dispatch ",(0,s.jsx)(n.code,{children:"waitMessageAction.open()"})," / ",(0,s.jsx)(n.code,{children:"waitMessageAction.close()"})," to control it (see ",(0,s.jsx)(n.a,{href:"#wait-messages",children:"Wait Messages"}),")."]}),"\n",(0,s.jsx)(n.h3,{id:"initialize-session-management",children:"Initialize Session Management"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { listenStorageEvents, getAppConfigValue } from '@elliemae/pui-app-sdk';\nimport {\n Environment,\n Logger,\n RuntimeLoggerOptions,\n} from '@elliemae/pui-diagnostics';\n\n// Initialize session management\nlistenStorageEvents();\n\n// Configure logger with session data\nexport const onInit: OnInitCallback = ({ history, homeRoute }) => {\n const sessionData = {\n environment: getAppConfigValue<Environment>('activeEnv'),\n appVersion: window.emui.version,\n instanceId: sessionStorage.getItem('instanceId') || '',\n userId: sessionStorage.getItem('userId') || '',\n };\n\n (logger as Logger).setOptions?.(sessionData as RuntimeLoggerOptions);\n logger.info('Application initialized');\n\n // ... rest of initialization\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"logrocket-integration",children:"LogRocket Integration"}),"\n",(0,s.jsx)(n.h4,{id:"initialization",children:"Initialization"}),"\n",(0,s.jsxs)(n.p,{children:["LogRocket is initialized by the host/loader layer (e.g. ",(0,s.jsx)(n.code,{children:"pui-app-loader"}),", ",(0,s.jsx)(n.code,{children:"encw-loader"}),") via ",(0,s.jsx)(n.code,{children:"@elliemae/pui-logrocket"}),". Micro-apps do not need to call ",(0,s.jsx)(n.code,{children:"initLogRocket()"})," themselves."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// Done by the loader \u2014 not by individual micro-apps\nimport { initLogRocket } from '@elliemae/pui-logrocket';\n\nif (window.emui?.logRocketConfig?.appId) {\n initLogRocket();\n}\n"})}),"\n",(0,s.jsx)(n.h4,{id:"user-identification",children:"User Identification"}),"\n",(0,s.jsxs)(n.p,{children:["The SDK automatically identifies users to LogRocket during the OAuth ",(0,s.jsx)(n.code,{children:"authorize()"})," flow:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"authorize() \u2192 getToken \u2192 introspectToken \u2192 sessionStorage.setItem('user', ...)\n \u2192 lrIdentify(userKey, { name, instanceId })\n \u2192 markLrIdentified(userKey) \u2190 prevents re-identification\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If LogRocket is not yet loaded when ",(0,s.jsx)(n.code,{children:"authorize()"})," runs (common in ",(0,s.jsx)(n.code,{children:"encw-loader"}),"), the ",(0,s.jsx)(n.code,{children:"lrIdentify"})," call is a no-op. The safety net is ",(0,s.jsx)(n.code,{children:"ensureLrIdentified"})," inside ",(0,s.jsx)(n.code,{children:"@elliemae/pui-analytics-so"})," \u2014 it automatically identifies the user from ",(0,s.jsx)(n.code,{children:"sessionStorage"})," on the first ",(0,s.jsx)(n.code,{children:"lrTrackGuarded"})," call after LogRocket becomes available."]}),"\n",(0,s.jsx)(n.p,{children:"Covered scenarios:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Scenario"}),(0,s.jsx)(n.th,{children:"How identified"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Fresh OAuth login"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"lrIdentify()"})," in ",(0,s.jsx)(n.code,{children:"authorize()"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Session restore (page refresh)"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"ensureLrIdentified"})," reads ",(0,s.jsx)(n.code,{children:"user"})," from ",(0,s.jsx)(n.code,{children:"sessionStorage"})," on first track"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Late LogRocket load"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"ensureLrIdentified"})," fires when LR becomes available"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Logout + new user login"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"resetLrIdentity()"})," on logout clears state; new ",(0,s.jsx)(n.code,{children:"authorize()"})," re-identifies"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Duplicate tab"}),(0,s.jsxs)(n.td,{children:["Fresh JS context; ",(0,s.jsx)(n.code,{children:"ensureLrIdentified"})," reads from copied ",(0,s.jsx)(n.code,{children:"sessionStorage"})]})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"tracking-events",children:"Tracking Events"}),"\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"lrTrack"})," from the SDK's ",(0,s.jsx)(n.code,{children:"logrocket"})," utility for custom LogRocket events. It delegates to ",(0,s.jsx)(n.code,{children:"lrTrackGuarded"})," from ",(0,s.jsx)(n.code,{children:"@elliemae/pui-analytics-so"})," which provides:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Event buffering"})," \u2014 events fired before LogRocket loads are queued (up to 20) and replayed once available"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Sliding-window throttle"})," \u2014 max 3 identical event+payload calls per second"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Property-count warning"})," \u2014 warns if more than 2 properties per event"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { lrTrack } from '../utils/logrocket';\n\n// Custom event tracking\nlrTrack('document-saved', { docId: '123' });\n\n// Events before LR loads are queued and replayed later\nlrTrack('login', { name: 'Jane', instanceId: 'inst-1' });\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For business analytics events that should reach both GTM and LogRocket, use ",(0,s.jsx)(n.code,{children:"Analytics.sendBAEvent()"})," via the scripting object \u2014 it calls ",(0,s.jsx)(n.code,{children:"lrTrackGuarded"})," internally."]}),"\n",(0,s.jsx)(n.h4,{id:"logout",children:"Logout"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"endSession"})," function handles LogRocket cleanup:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// Inside endSession() \u2014 already wired by the SDK\nlrTrack('logout');\nresetLrIdentity(); // clears identify state + pending event queue\nsessionStorage.clear();\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"resetLrIdentity()"})," ensures that:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The next session starts with a fresh identify state"}),"\n",(0,s.jsx)(n.li,{children:"Any queued events from the previous session are discarded"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"service-worker",children:"Service Worker"}),"\n",(0,s.jsx)(n.p,{children:"Initialize service worker for your app:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { initServiceWorker } from '@elliemae/pui-app-sdk';\nimport { getBasePath } from './utils/paths';\n\n// Initialize after creating CMicroApp instance\napp = CMicroApp.getInstance({\n logger,\n onInit,\n onMount,\n onUnmount,\n});\n\n// Initialize service worker\ninitServiceWorker(getBasePath());\n"})}),"\n",(0,s.jsx)(n.h2,{id:"app-configuration",children:"App Configuration"}),"\n",(0,s.jsx)(n.h3,{id:"loading-configuration",children:"Loading Configuration"}),"\n",(0,s.jsx)(n.p,{children:"Load configuration from a JSON file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n loadAppConfig,\n setAppConfig,\n getAppConfigValue,\n} from '@elliemae/pui-app-sdk';\n\n// Load from JSON file\nawait loadAppConfig('/path/to/app.config.json');\n\n// Set configuration programmatically\nsetAppConfig({\n appId: 'my-app',\n activeEnv: 'production',\n serviceEndpoints: {\n api: 'https://api.example.com',\n },\n});\n\n// Get specific config value\nconst apiEndpoint = getAppConfigValue('serviceEndpoints.api');\nconst appId = getAppConfigValue('appId');\n"})}),"\n",(0,s.jsx)(n.h3,{id:"get-full-configuration",children:"Get Full Configuration"}),"\n",(0,s.jsx)(n.p,{children:"Retrieve the entire parsed config object. Useful when passing the config to other libraries (e.g. App Bridge):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { getAppConfig } from '@elliemae/pui-app-sdk';\n\nconst config = getAppConfig();\n// { appId: 'myapp', activeEnv: 'dev', microFrontendApps: { ... }, ... }\n"})}),"\n",(0,s.jsx)(n.h3,{id:"update-configuration-values",children:"Update Configuration Values"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { setAppConfigValue } from '@elliemae/pui-app-sdk';\n\n// Update individual config value\nsetAppConfigValue('activeEnv', 'staging');\nsetAppConfigValue('serviceEndpoints.api', 'https://staging-api.example.com');\n"})}),"\n",(0,s.jsx)(n.h2,{id:"web-storage-events",children:"Web Storage Events"}),"\n",(0,s.jsx)(n.p,{children:"Listen to storage events across tabs/windows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n listenStorageEvents,\n removeStorageEvents,\n} from '@elliemae/pui-app-sdk';\n\n// Start listening to storage events\nlistenStorageEvents();\n\n// Stop listening\nremoveStorageEvents();\n"})}),"\n",(0,s.jsx)(n.h2,{id:"micro-frontend-communication",children:"Micro-Frontend Communication"}),"\n",(0,s.jsx)(n.h3,{id:"host-app-data-exchange",children:"Host App Data Exchange"}),"\n",(0,s.jsx)(n.p,{children:"Exchange data between host and guest apps:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n setHostAppData,\n getHostAppDataByKey,\n fetchHostAppData,\n sendMessageToHost,\n} from '@elliemae/pui-app-sdk';\n\n// In host app: Set data for guest apps\nsetHostAppData({ userId: '123', theme: 'dark' });\n\n// In guest app: Get host data by key\nconst userId = getHostAppDataByKey('userId');\n\n// Fetch all host data\nconst hostData = await fetchHostAppData();\n\n// Send message to host app\nsendMessageToHost({ type: 'UPDATE_THEME', payload: 'light' });\n"})}),"\n",(0,s.jsx)(n.h3,{id:"guest-unload-handlers",children:"Guest Unload Handlers"}),"\n",(0,s.jsx)(n.p,{children:"Handle guest app unload events:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n onGuestUnloadStart,\n notifyGuestUnloadComplete,\n} from '@elliemae/pui-app-sdk';\n\n// Register unload start handler\nonGuestUnloadStart(() => {\n console.log('Guest app is unloading');\n // Cleanup resources\n});\n\n// Notify when unload is complete\nnotifyGuestUnloadComplete();\n"})}),"\n",(0,s.jsx)(n.h3,{id:"render-with-host-data",children:"Render with Host Data"}),"\n",(0,s.jsx)(n.p,{children:"Render component with host app data:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { renderWithHostData } from '@elliemae/pui-app-sdk';\n\nrenderWithHostData(<App />, {\n hostData: { userId: '123' },\n containerId: 'root',\n});\n"})}),"\n",(0,s.jsx)(n.h2,{id:"authentication-utilities",children:"Authentication Utilities"}),"\n",(0,s.jsx)(n.h3,{id:"auth-helper-functions",children:"Auth Helper Functions"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n isUserAuthorized,\n login,\n authorize,\n endSession,\n getAuthorizationHeader,\n setLoginParams,\n} from '@elliemae/pui-app-sdk';\n\n// Check if user is authorized\nif (isUserAuthorized()) {\n // User is logged in\n}\n\n// Get authorization header for API calls\nconst authHeader = getAuthorizationHeader();\n// Returns: 'Bearer <token>'\n\n// Set login parameters\nsetLoginParams({\n clientId: 'your-client-id',\n redirectUri: 'https://your-app.com/callback',\n scope: 'openid profile',\n});\n\n// Trigger login\nawait login();\n\n// Trigger authorization\nawait authorize();\n\n// End session (logout)\nawait endSession({\n clientId: 'your-client-id',\n redirectUri: 'https://your-app.com',\n});\n"})}),"\n",(0,s.jsx)(n.h3,{id:"auth-subpath-exports",children:"Auth Subpath Exports"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"@elliemae/pui-app-sdk/auth"})," subpath exports additional low-level functions not available on the root package:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n getIDPInfoFromUrl,\n navigateToLoginPage,\n} from '@elliemae/pui-app-sdk/auth';\n"})}),"\n",(0,s.jsx)(n.h4,{id:"getidpinfofromurl",children:"getIDPInfoFromUrl"}),"\n",(0,s.jsxs)(n.p,{children:["Extracts the authorization ",(0,s.jsx)(n.code,{children:"code"})," and ",(0,s.jsx)(n.code,{children:"error_code"})," from the current URL (set by the IDP after redirect):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const { code, idpErrorCode, redirectUri } = getIDPInfoFromUrl();\nif (code) {\n await authorize({ code, redirectUri, ... });\n}\n"})}),"\n",(0,s.jsx)(n.h4,{id:"navigatetologinpage",children:"navigateToLoginPage"}),"\n",(0,s.jsx)(n.p,{children:"Redirects the browser to the IDP login page with the specified OAuth parameters:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"navigateToLoginPage({\n clientId: 'my-app',\n redirectUri: window.location.href,\n idpErrorCode: '',\n scope: 'openid',\n responseType: 'code',\n instanceId: 12345, // optional\n siteId: 1, // optional\n userId: 'jdoe', // optional\n disableRememberMe: true, // optional\n useCompactIdpPage: false, // optional\n isSSO: false, // optional\n});\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["In most cases, use ",(0,s.jsx)(n.code,{children:"login()"})," from the root package \u2014 it calls ",(0,s.jsx)(n.code,{children:"getIDPInfoFromUrl"})," and ",(0,s.jsx)(n.code,{children:"navigateToLoginPage"})," / ",(0,s.jsx)(n.code,{children:"authorize"})," internally."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"require-auth-component",children:"Require Auth Component"}),"\n",(0,s.jsx)(n.p,{children:"Protect routes requiring authentication:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { RequireAuth } from '@elliemae/pui-app-sdk';\n\nfunction App() {\n return (\n <RequireAuth>\n <ProtectedContent />\n </RequireAuth>\n );\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"utility-hooks",children:"Utility Hooks"}),"\n",(0,s.jsx)(n.h3,{id:"useinjectquery",children:"useInjectQuery"}),"\n",(0,s.jsx)(n.p,{children:"Inject RTK Query endpoints dynamically:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useInjectQuery } from '@elliemae/pui-app-sdk';\nimport { api } from './api';\n\nfunction MyComponent() {\n useInjectQuery({ key: 'users', endpoint: api.endpoints.getUsers });\n\n // Use the endpoint\n const { data } = api.endpoints.getUsers.useQuery();\n\n return <div>{/* render data */}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"useinjectsideeffect",children:"useInjectSideEffect"}),"\n",(0,s.jsx)(n.p,{children:"Inject side effects dynamically:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useInjectSideEffect } from '@elliemae/pui-app-sdk';\n\nfunction MyComponent() {\n useInjectSideEffect({\n key: 'analytics',\n effect: (action, listenerApi) => {\n // Track analytics\n },\n });\n\n return <div>{/* component */}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"useappmiddleware",children:"useAppMiddleware"}),"\n",(0,s.jsx)(n.p,{children:"Access Redux middleware dynamically:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useAppMiddleware } from '@elliemae/pui-app-sdk';\n\nfunction MyComponent() {\n const middleware = useAppMiddleware();\n\n // Use middleware\n\n return <div>{/* component */}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"form-components",children:"Form Components"}),"\n",(0,s.jsx)(n.p,{children:"The SDK provides form field components with React Hook Form integration:"}),"\n",(0,s.jsx)(n.h3,{id:"available-form-components",children:"Available Form Components"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n Form,\n TextBox,\n InputText,\n LargeTextBox,\n InputMask,\n MaskedInputText,\n ComboBox,\n ComboBoxV3,\n CheckBox,\n Radio,\n RadioGroup,\n DateInput,\n DatePicker,\n DateTimePicker,\n DateRangePicker,\n Autocomplete,\n Toggle,\n FormSubmitButton,\n FormItemLayout,\n FormLayoutBlockItem,\n ConnectForm,\n FormPropsContext,\n} from '@elliemae/pui-app-sdk';\n"})}),"\n",(0,s.jsx)(n.h3,{id:"textbox",children:"TextBox"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<TextBox\n name="firstName"\n label="First Name"\n placeholder="Enter first name"\n rules={{ required: \'First name is required\' }}\n/>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"inputmask",children:"InputMask"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'import { InputMask, MASK_TYPES, MASK_PIPES } from \'@elliemae/pui-app-sdk\';\n\n<InputMask\n name="phone"\n label="Phone Number"\n mask={MASK_TYPES.PHONE}\n pipe={MASK_PIPES.PHONE}\n/>;\n'})}),"\n",(0,s.jsx)(n.h3,{id:"combobox",children:"ComboBox"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"<ComboBox\n name=\"country\"\n label=\"Country\"\n options={[\n { value: 'us', label: 'United States' },\n { value: 'ca', label: 'Canada' },\n ]}\n rules={{ required: 'Please select a country' }}\n/>\n"})}),"\n",(0,s.jsx)(n.h3,{id:"datepicker",children:"DatePicker"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<DatePicker\n name="birthDate"\n label="Date of Birth"\n rules={{ required: \'Date of birth is required\' }}\n/>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"daterangepicker",children:"DateRangePicker"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<DateRangePicker\n name="dateRange"\n label="Select Date Range"\n startLabel="Start Date"\n endLabel="End Date"\n/>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"checkbox",children:"CheckBox"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<CheckBox\n name="agreeToTerms"\n label="I agree to the terms and conditions"\n rules={{ required: \'You must agree to continue\' }}\n/>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"radiogroup",children:"RadioGroup"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<RadioGroup name="paymentMethod" label="Payment Method">\n <Radio value="credit" label="Credit Card" />\n <Radio value="debit" label="Debit Card" />\n <Radio value="paypal" label="PayPal" />\n</RadioGroup>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"toggle",children:"Toggle"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<Toggle name="notifications" label="Enable Notifications" />\n'})}),"\n",(0,s.jsx)(n.h3,{id:"autocomplete",children:"Autocomplete"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<Autocomplete\n name="city"\n label="City"\n options={cities}\n onInputChange={(value) => fetchCities(value)}\n/>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"form-layout",children:"Form Layout"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'<Form onSubmit={handleSubmit}>\n <FormItemLayout>\n <TextBox name="firstName" label="First Name" />\n <TextBox name="lastName" label="Last Name" />\n </FormItemLayout>\n\n <FormLayoutBlockItem>\n <LargeTextBox name="comments" label="Comments" rows={4} />\n </FormLayoutBlockItem>\n\n <FormSubmitButton>Submit</FormSubmitButton>\n</Form>\n'})}),"\n",(0,s.jsxs)(n.h3,{id:"reading-the-react-hook-form-configuration-formpropscontext",children:["Reading the React Hook Form Configuration (",(0,s.jsx)(n.code,{children:"FormPropsContext"}),")"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"<Form>"})," builds its ",(0,s.jsx)(n.code,{children:"useForm"})," instance from the ",(0,s.jsx)(n.code,{children:"reactHookFormProps"})," prop\n(",(0,s.jsx)(n.code,{children:"{ mode: 'onBlur' }"})," by default) and exposes that configuration to descendants\nthrough ",(0,s.jsx)(n.code,{children:"FormPropsContext"}),". Use it when a child needs to read the original\n",(0,s.jsx)(n.code,{children:"UseFormProps"})," (e.g. ",(0,s.jsx)(n.code,{children:"mode"}),") without prop-drilling."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useContext } from 'react';\nimport { FormPropsContext } from '@elliemae/pui-app-sdk';\n\nconst MyCustomSubmitButton = () => {\n const mode = useContext(FormPropsContext)?.mode;\n\n return <button disabled={mode !== 'onSubmit'}>Submit</button>;\n};\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note:"})," Earlier versions of the SDK encouraged casting\n",(0,s.jsx)(n.code,{children:"useFormContext()"})," to a ",(0,s.jsx)(n.code,{children:"CustomFormProviderProps"})," shape to read\n",(0,s.jsx)(n.code,{children:"formProps.mode"}),". That pattern stopped working with ",(0,s.jsx)(n.code,{children:"react-hook-form@7.x"}),",\nwhose ",(0,s.jsx)(n.code,{children:"FormProvider"})," only forwards a fixed allow-list of ",(0,s.jsx)(n.code,{children:"UseFormReturn"}),"\nfields into context. Migrate any such consumer to\n",(0,s.jsx)(n.code,{children:"useContext(FormPropsContext)"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"storybook-integration",children:"Storybook Integration"}),"\n",(0,s.jsx)(n.p,{children:"Decorate Storybook stories with app context:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { withAppDecorator } from '@elliemae/pui-app-sdk';\n\nexport default {\n title: 'Components/MyComponent',\n component: MyComponent,\n decorators: [withAppDecorator],\n};\n"})}),"\n",(0,s.jsx)(n.h2,{id:"utility-components",children:"Utility Components"}),"\n",(0,s.jsx)(n.h3,{id:"visuallyhidden",children:"VisuallyHidden"}),"\n",(0,s.jsx)(n.p,{children:"Hide content visually but keep it accessible to screen readers:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { VisuallyHidden } from '@elliemae/pui-app-sdk';\n\n<VisuallyHidden>\n <label htmlFor=\"search\">Search</label>\n</VisuallyHidden>;\n"})}),"\n",(0,s.jsx)(n.h3,{id:"page-component",children:"Page Component"}),"\n",(0,s.jsx)(n.p,{children:"Set page title and metadata:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { Page } from '@elliemae/pui-app-sdk';\n\n<Page pageTitle=\"Dashboard\">\n <DashboardContent />\n</Page>;\n"})}),"\n",(0,s.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(n.h3,{id:"testing-with-redux",children:"Testing with Redux"}),"\n",(0,s.jsx)(n.p,{children:"The SDK provides testing helpers for components with Redux:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n renderWithRouterRedux,\n renderWithRedux,\n renderWithRouter,\n} from '@elliemae/pui-app-sdk';\nimport { screen } from '@testing-library/react';\n\ndescribe('MyComponent', () => {\n it('renders with Redux state', () => {\n renderWithRedux(<MyComponent />, {\n initialState: { user: { name: 'John' } },\n });\n\n expect(screen.getByText('John')).toBeInTheDocument();\n });\n\n it('renders with Router and Redux', () => {\n renderWithRouterRedux(<MyComponent />, {\n initialState: { resources: [] },\n route: '/resources',\n });\n\n expect(screen.getByTestId('resource-list')).toBeInTheDocument();\n });\n});\n"})}),"\n",(0,s.jsx)(n.h3,{id:"testing-library-re-exports",children:"Testing Library Re-exports"}),"\n",(0,s.jsxs)(n.p,{children:["The SDK re-exports common ",(0,s.jsx)(n.code,{children:"@testing-library/react"})," utilities so you can import everything from one place:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import {\n render, // custom render wrapped with AppRoot + theme + store\n screen,\n waitFor,\n waitForElementToBeRemoved,\n within,\n fireEvent,\n act,\n cleanup,\n renderHook,\n} from '@elliemae/pui-app-sdk';\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The custom ",(0,s.jsx)(n.code,{children:"render"})," wraps components in ",(0,s.jsx)(n.code,{children:"AppRoot"})," with a default store and theme. For more control, use ",(0,s.jsx)(n.code,{children:"renderWithRedux"})," or ",(0,s.jsx)(n.code,{children:"renderWithRouterRedux"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"renderwithstateaddons",children:"RenderWithStateAddOns"}),"\n",(0,s.jsx)(n.p,{children:"A component that injects reducers, sagas, and theme in one shot \u2014 useful in Storybook stories or integration tests:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { RenderWithStateAddOns } from '@elliemae/pui-app-sdk';\n\n<RenderWithStateAddOns\n Component={MyComponent}\n reducer={{ key: 'resources', reducer: resourcesReducer }}\n saga={{ key: 'resources', saga: resourcesSaga }}\n theme={myTheme}\n someProp=\"value\"\n/>;\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Accepts single or array values for ",(0,s.jsx)(n.code,{children:"reducer"})," and ",(0,s.jsx)(n.code,{children:"saga"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"<RenderWithStateAddOns\n Component={Dashboard}\n reducer={[\n { key: 'resources', reducer: resourcesReducer },\n { key: 'users', reducer: usersReducer },\n ]}\n saga={[\n { key: 'resources', saga: resourcesSaga },\n { key: 'users', saga: usersSaga },\n ]}\n/>\n"})}),"\n",(0,s.jsx)(n.h2,{id:"common-patterns",children:"Common Patterns"}),"\n",(0,s.jsx)(n.h3,{id:"error-boundaries",children:"Error Boundaries"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { ErrorBoundary, ErrorToast } from '@elliemae/pui-app-sdk';\n\nfunction App() {\n return (\n <ErrorBoundary>\n <ErrorToast />\n <YourApp />\n </ErrorBoundary>\n );\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"api-error-handling-with-rtk-query",children:"API Error Handling with RTK Query"}),"\n",(0,s.jsx)(n.p,{children:"RTK Query provides automatic error handling with built-in error states:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useGetResourceQuery } from './api/resources';\nimport { error } from '@elliemae/pui-app-sdk';\nimport { useAppDispatch } from '@elliemae/pui-app-sdk';\n\nfunction ResourceDetails({ id }: { id: string }) {\n const dispatch = useAppDispatch();\n const { data, error: queryError, isError } = useGetResourceQuery(id);\n\n useEffect(() => {\n if (isError && queryError) {\n dispatch(\n error.set({\n messageText: 'Failed to load resource. Please try again.',\n }),\n );\n }\n }, [isError, queryError, dispatch]);\n\n if (isError) return <div>Error loading resource</div>;\n\n return <div>{data?.name}</div>;\n}\n"})}),"\n",(0,s.jsx)(n.h3,{id:"api-error-handling-legacy-pattern",children:"API Error Handling (Legacy Pattern)"}),"\n",(0,s.jsx)(n.p,{children:"For direct HTTP client usage, always wrap API calls with proper error handling:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"export const getResource = async (id: string) => {\n try {\n const { data } = await getAuthHTTPClient().get(`/api/resource/${id}`);\n return data;\n } catch (err) {\n logger.error({\n message: 'Failed to get resource',\n exception: err as Error,\n });\n throw new Error(\n `Unable to get resource. Please try again later. Details: ${\n (err as Error)?.message\n }`,\n );\n }\n};\n"})}),"\n",(0,s.jsx)(n.h2,{id:"type-exports",children:"Type Exports"}),"\n",(0,s.jsx)(n.p,{children:"The SDK exports these TypeScript types for use in your application:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import type {\n RootState, // Root Redux state type\n AppStore, // Store type returned by configureStore\n AppDispatch, // Dispatch type for the store\n AppConfig, // Shape of app.config.json\n EMUI, // Shape of window.emui\n Await, // Utility: unwrap Promise<T> to T\n GuestProps, // Props available on CMicroApp instance\n OnInitCallback, // Signature for CMicroApp onInit\n OnMountCallback, // Signature for CMicroApp onMount\n OnUnMountCallback, // Signature for CMicroApp onUnmount\n OnHostInitCallback, // Signature for CMicroAppHost onInit\n HostProvidedParams, // Host-provided values for module SO\n ModuleOverrides, // Method overrides for GuestModule\n UseStateSelectorOptions, // Options for useStateSelector\n SelectStateFieldFunction, // Return type of getSelectField\n} from '@elliemae/pui-app-sdk';\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Extend ",(0,s.jsx)(n.code,{children:"RootState"})," for typed selectors when you inject additional reducers:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import type { RootState } from '@elliemae/pui-app-sdk';\nimport { reducer } from './data/resources';\n\ntype AppState = RootState & { resources: ReturnType<typeof reducer> };\n"})}),"\n",(0,s.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(n.h3,{id:"store-not-initialized",children:"Store Not Initialized"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your store is initialized in the ",(0,s.jsx)(n.code,{children:"onInit"})," callback:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"export const onInit: OnInitCallback = ({ history, homeRoute }) => {\n store = configureStore({} as RootState, history);\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"saga-not-running",children:"Saga Not Running"}),"\n",(0,s.jsx)(n.p,{children:"Make sure to inject sagas in your layout or root component:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"import { useInjectSaga } from '@elliemae/pui-app-sdk';\n\nexport const Layout = () => {\n useInjectSaga({ key: 'resources', saga: resourceSagas });\n // ...\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"scripting-objects-not-available",children:"Scripting Objects Not Available"}),"\n",(0,s.jsx)(n.p,{children:"Ensure scripting objects are added during initialization:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"export const onInit: OnInitCallback = ({ history, homeRoute }) => {\n // ... store initialization\n addScriptingObjects().catch(() => {\n logger.error('Failed to add scripting objects');\n });\n};\n"})}),"\n",(0,s.jsx)(n.h3,{id:"form-validation-issues",children:"Form Validation Issues"}),"\n",(0,s.jsx)(n.p,{children:"For field-level validation, ensure you're passing correct rules:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"<TextBox\n name=\"email\"\n rules={{\n required: 'Email is required',\n pattern: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Invalid email address',\n },\n }}\n/>\n"})}),"\n",(0,s.jsx)(n.h3,{id:"host-guest-communication",children:"Host-Guest Communication"}),"\n",(0,s.jsx)(n.p,{children:"For communication between host and guest apps:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"// In guest app\nimport { sendMessageToHost } from '@elliemae/pui-app-sdk';\n\nsendMessageToHost({ type: 'UPDATE', payload: data });\n\n// In host app\nimport { fetchHostAppData } from '@elliemae/pui-app-sdk';\n\nconst hostData = await fetchHostAppData();\n"})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5589(e,n,i){i.d(n,{R:()=>o,x:()=>a});var t=i(758);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[3237],{4245(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"api/functions/authSaga","title":"authSaga()","description":"Returns","source":"@site/docs/api/functions/authSaga.md","sourceDirName":"api/functions","slug":"/api/functions/authSaga","permalink":"/app-sdk/api/functions/authSaga","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/functions/authSaga.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Toggle()","permalink":"/app-sdk/api/functions/Toggle"},"next":{"title":"authorize()","permalink":"/app-sdk/api/functions/authorize"}}');var s=t(6070),i=t(5589);const r={},o="authSaga()",c={},u=[{value:"Returns",id:"returns",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"authsaga",children:"authSaga()"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ts",children:"function authSaga(): Generator<ForkEffect, void, unknown>;\n"})}),"\n",(0,s.jsx)(n.h2,{id:"returns",children:"Returns"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Generator"}),"<",(0,s.jsx)(n.code,{children:"ForkEffect"}),", ",(0,s.jsx)(n.code,{children:"void"}),", ",(0,s.jsx)(n.code,{children:"unknown"}),">"]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5589(e,n,t){t.d(n,{R:()=>r,x:()=>o});var a=t(758);const s={},i=a.createContext(s);function r(e){const n=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[8768],{48(e,a,t){t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>d,default:()=>o,frontMatter:()=>i,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api/variables/updateBAEventParameters","title":"updateBAEventParameters","description":"Updates the business analytics event parameters with new values","source":"@site/docs/api/variables/updateBAEventParameters.md","sourceDirName":"api/variables","slug":"/api/variables/updateBAEventParameters","permalink":"/app-sdk/api/variables/updateBAEventParameters","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/variables/updateBAEventParameters.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"startSideEffect","permalink":"/app-sdk/api/variables/startSideEffect"},"next":{"title":"useAppSelector","permalink":"/app-sdk/api/variables/useAppSelector"}}');var s=t(6070),n=t(5589);const i={},d="updateBAEventParameters",p={},l=[{value:"Type Parameters",id:"type-parameters",level:2},{value:"T",id:"t",level:3},{value:"Parameters",id:"parameters",level:2},{value:"params",id:"params",level:3},{value:"Returns",id:"returns",level:2}];function c(e){const a={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"updatebaeventparameters",children:"updateBAEventParameters"})}),"\n",(0,s.jsx)(a.pre,{children:(0,s.jsx)(a.code,{className:"language-ts",children:"const updateBAEventParameters: <T>(params: T) => void;\n"})}),"\n",(0,s.jsx)(a.p,{children:"Updates the business analytics event parameters with new values"}),"\n",(0,s.jsx)(a.h2,{id:"type-parameters",children:"Type Parameters"}),"\n",(0,s.jsx)(a.h3,{id:"t",children:"T"}),"\n",(0,s.jsxs)(a.p,{children:[(0,s.jsx)(a.code,{children:"T"})," ",(0,s.jsx)(a.em,{children:"extends"})," ",(0,s.jsx)(a.code,{children:"Record"}),"<",(0,s.jsx)(a.code,{children:"string"}),", ",(0,s.jsx)(a.code,{children:"unknown"}),">"]}),"\n",(0,s.jsx)(a.h2,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsx)(a.h3,{id:"params",children:"params"}),"\n",(0,s.jsx)(a.p,{children:(0,s.jsx)(a.code,{children:"T"})}),"\n",(0,s.jsx)(a.p,{children:"New parameters to merge with existing ones"}),"\n",(0,s.jsx)(a.h2,{id:"returns",children:"Returns"}),"\n",(0,s.jsx)(a.p,{children:(0,s.jsx)(a.code,{children:"void"})})]})}function o(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},5589(e,a,t){t.d(a,{R:()=>i,x:()=>d});var r=t(758);const s={},n=r.createContext(s);function i(e){const a=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function d(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(n.Provider,{value:a},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[3949],{4110(e,n,t){t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"api/variables/globalConstants","title":"globalConstants","description":"Type Declaration","source":"@site/docs/api/variables/globalConstants.md","sourceDirName":"api/variables","slug":"/api/variables/globalConstants","permalink":"/app-sdk/api/variables/globalConstants","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/variables/globalConstants.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"fireEvent","permalink":"/app-sdk/api/variables/fireEvent"},"next":{"title":"history","permalink":"/app-sdk/api/variables/history"}}');var s=t(6070),i=t(5589);const l={},r="globalConstants",o={},c=[{value:"Type Declaration",id:"type-declaration",level:2},{value:"AUTHORIZATION",id:"authorization",level:3},{value:"CLIENT_ID",id:"client_id",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"globalconstants",children:"globalConstants"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ts",children:"globalConstants: {\n AUTHORIZATION: string;\n CLIENT_ID: string;\n};\n"})}),"\n",(0,s.jsx)(n.h2,{id:"type-declaration",children:"Type Declaration"}),"\n",(0,s.jsx)(n.h3,{id:"authorization",children:"AUTHORIZATION"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ts",children:"AUTHORIZATION: string = 'Authorization';\n"})}),"\n",(0,s.jsx)(n.h3,{id:"client_id",children:"CLIENT_ID"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ts",children:"CLIENT_ID: string = 'tirykwfo';\n"})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5589(e,n,t){t.d(n,{R:()=>l,x:()=>r});var a=t(758);const s={},i=a.createContext(s);function l(e){const n=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[4683],{9711(e,r,a){a.r(r),a.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"api/variables/errorMiddleware","title":"errorMiddleware","description":"","source":"@site/docs/api/variables/errorMiddleware.md","sourceDirName":"api/variables","slug":"/api/variables/errorMiddleware","permalink":"/app-sdk/api/variables/errorMiddleware","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/variables/errorMiddleware.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"error","permalink":"/app-sdk/api/variables/error"},"next":{"title":"fireEvent","permalink":"/app-sdk/api/variables/fireEvent"}}');var t=a(6070),n=a(5589);const s={},o="errorMiddleware",d={},l=[];function p(e){const r={code:"code",h1:"h1",header:"header",pre:"pre",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"errormiddleware",children:"errorMiddleware"})}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-ts",children:"const errorMiddleware: Middleware;\n"})})]})}function c(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},5589(e,r,a){a.d(r,{R:()=>s,x:()=>o});var i=a(758);const t={},n=i.createContext(t);function s(e){const r=i.useContext(n);return i.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(n.Provider,{value:r},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[903],{218(e,o,n){n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"api/functions/ComboBox","title":"ComboBox()","description":"Dropdown/select field component with React Hook Form integration.","source":"@site/docs/api/functions/ComboBox.md","sourceDirName":"api/functions","slug":"/api/functions/ComboBox","permalink":"/app-sdk/api/functions/ComboBox","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/functions/ComboBox.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"CheckBox()","permalink":"/app-sdk/api/functions/CheckBox"},"next":{"title":"ComboBoxV3()","permalink":"/app-sdk/api/functions/ComboBoxV3"}}');var r=n(6070),s=n(5589);const i={},a="ComboBox()",l={},c=[{value:"Parameters",id:"parameters",level:2},{value:"props",id:"props",level:3},{value:"Returns",id:"returns",level:2},{value:"Example",id:"example",level:2}];function p(e){const o={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"combobox",children:"ComboBox()"})}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{className:"language-ts",children:"function ComboBox(props: ComboBoxProps): Element;\n"})}),"\n",(0,r.jsx)(o.p,{children:"Dropdown/select field component with React Hook Form integration.\nWraps the Dimsum ComboBox component with form state management and validation."}),"\n",(0,r.jsx)(o.h2,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsx)(o.h3,{id:"props",children:"props"}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.code,{children:"ComboBoxProps"})}),"\n",(0,r.jsx)(o.p,{children:"ComboBox component props"}),"\n",(0,r.jsx)(o.h2,{id:"returns",children:"Returns"}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.code,{children:"Element"})}),"\n",(0,r.jsx)(o.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{className:"language-tsx",children:"<Form onSubmit={handleSubmit}>\n <ComboBox\n name=\"country\"\n label=\"Country\"\n options={[\n { label: 'USA', value: 'us' },\n { label: 'Canada', value: 'ca' }\n ]}\n rules={{ required: 'Please select a country' }}\n />\n</Form>\n"})})]})}function d(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},5589(e,o,n){n.d(o,{R:()=>i,x:()=>a});var t=n(758);const r={},s=t.createContext(r);function i(e){const o=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:o},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[7917],{7369(n,e,t){t.r(e),t.d(e,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"api/functions/onGuestUnloadStart","title":"onGuestUnloadStart()","description":"Returns","source":"@site/docs/api/functions/onGuestUnloadStart.md","sourceDirName":"api/functions","slug":"/api/functions/onGuestUnloadStart","permalink":"/app-sdk/api/functions/onGuestUnloadStart","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/functions/onGuestUnloadStart.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"onAuthorizationFailure()","permalink":"/app-sdk/api/functions/onAuthorizationFailure"},"next":{"title":"redactPii()","permalink":"/app-sdk/api/functions/redactPii"}}');var s=t(6070),r=t(5589);const a={},i="onGuestUnloadStart()",u={},c=[{value:"Returns",id:"returns",level:2}];function d(n){const e={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"onguestunloadstart",children:"onGuestUnloadStart()"})}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-ts",children:"function onGuestUnloadStart(): Promise<unknown>;\n"})}),"\n",(0,s.jsx)(e.h2,{id:"returns",children:"Returns"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.code,{children:"Promise"}),"<",(0,s.jsx)(e.code,{children:"unknown"}),">"]})]})}function l(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(d,{...n})}):d(n)}},5589(n,e,t){t.d(e,{R:()=>a,x:()=>i});var o=t(758);const s={},r=o.createContext(s);function a(n){const e=o.useContext(r);return o.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function i(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:a(n.components),o.createElement(r.Provider,{value:e},n.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[1126],{124(t,e,s){s.d(e,{A:()=>r});var i=s(6554),n=s(7766);const r=(t,e)=>i.A.lang.round(n.A.parse(t)[e])},2626(t,e,s){s.d(e,{P:()=>r});var i=s(3316),n=s(7970),r=(0,n.K2)((t,e,s,r)=>{t.attr("class",s);const{width:c,height:l,x:h,y:u}=a(t,e);(0,i.a$)(t,l,c,r);const d=o(h,u,c,l,e);t.attr("viewBox",d),n.Rm.debug(`viewBox configured: ${d} with padding: ${e}`)},"setupViewPortForSVG"),a=(0,n.K2)((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}},"calculateDimensionsWithPadding"),o=(0,n.K2)((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`,"createViewBox")},5934(t,e,s){s.d(e,{A:()=>r});var i=s(7970),n=s(7012),r=(0,i.K2)((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)},"getDiagramElement")},1126(t,e,s){s.d(e,{diagram:()=>k});var i=s(5934),n=s(2626),r=s(7019),a=(s(2452),s(2993),s(3641),s(566),s(9478),s(2864),s(1546)),o=s(3316),c=s(7970),l=s(7012),h=s(941),u=s(124),d=function(){var t=(0,c.K2)(function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52],s=[1,10],i=[1,11],n=[1,12],r=[1,13],a=[1,23],o=[1,24],l=[1,25],h=[1,26],u=[1,27],d=[1,19],y=[1,28],p=[1,29],_=[1,20],g=[1,18],b=[1,21],m=[1,22],f=[1,36],E=[1,37],k=[1,38],T=[1,39],O=[1,40],S=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52,65,66,67,68,69],A=[1,45],N=[1,46],R=[1,55],I=[40,48,50,51,52,70,71],C=[1,66],$=[1,64],x=[1,61],D=[1,65],v=[1,67],w=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,51,52,65,66,67,68,69],L=[65,66,67,68,69],K=[1,84],M=[1,83],B=[1,81],F=[1,82],Y=[6,10,42,47],P=[6,10,13,41,42,47,48,49],z=[1,92],G=[1,91],U=[1,90],Z=[19,58],W=[1,101],j=[1,100],X=[19,58,60,62],V={trace:(0,c.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,DECIMAL_NUM:51,ENTITY_ONE:52,attribute:53,attributeType:54,attributeName:55,attributeKeyTypeList:56,attributeComment:57,ATTRIBUTE_WORD:58,attributeKeyType:59,",":60,ATTRIBUTE_KEY:61,COMMENT:62,cardinality:63,relType:64,ZERO_OR_ONE:65,ZERO_OR_MORE:66,ONE_OR_MORE:67,ONLY_ONE:68,MD_PARENT:69,NON_IDENTIFYING:70,IDENTIFYING:71,WORD:72,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",51:"DECIMAL_NUM",52:"ENTITY_ONE",58:"ATTRIBUTE_WORD",60:",",61:"ATTRIBUTE_KEY",62:"COMMENT",65:"ZERO_OR_ONE",66:"ZERO_OR_MORE",67:"ONE_OR_MORE",68:"ONLY_ONE",69:"MD_PARENT",70:"NON_IDENTIFYING",71:"IDENTIFYING",72:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[11,1],[11,1],[11,1],[18,1],[18,2],[53,2],[53,3],[53,3],[53,4],[54,1],[55,1],[56,1],[56,3],[59,1],[57,1],[12,3],[63,1],[63,1],[63,1],[63,1],[63,1],[64,1],[64,1],[14,1],[14,1],[14,1]],performAction:(0,c.K2)(function(t,e,s,i,n,r,a){var o=r.length-1;switch(n){case 1:break;case 2:case 6:case 7:this.$=[];break;case 3:r[o-1].push(r[o]),this.$=r[o-1];break;case 4:case 5:case 55:case 56:case 57:case 58:case 81:case 65:case 66:case 69:this.$=r[o];break;case 8:i.addEntity(r[o-4]),i.addEntity(r[o-2]),i.addRelationship(r[o-4],r[o],r[o-2],r[o-3]);break;case 9:i.addEntity(r[o-8]),i.addEntity(r[o-4]),i.addRelationship(r[o-8],r[o],r[o-4],r[o-5]),i.setClass([r[o-8]],r[o-6]),i.setClass([r[o-4]],r[o-2]);break;case 10:i.addEntity(r[o-6]),i.addEntity(r[o-2]),i.addRelationship(r[o-6],r[o],r[o-2],r[o-3]),i.setClass([r[o-6]],r[o-4]);break;case 11:i.addEntity(r[o-6]),i.addEntity(r[o-4]),i.addRelationship(r[o-6],r[o],r[o-4],r[o-5]),i.setClass([r[o-4]],r[o-2]);break;case 12:i.addEntity(r[o-3]),i.addAttributes(r[o-3],r[o-1]);break;case 13:i.addEntity(r[o-5]),i.addAttributes(r[o-5],r[o-1]),i.setClass([r[o-5]],r[o-3]);break;case 14:i.addEntity(r[o-2]);break;case 15:i.addEntity(r[o-4]),i.setClass([r[o-4]],r[o-2]);break;case 16:i.addEntity(r[o]);break;case 17:i.addEntity(r[o-2]),i.setClass([r[o-2]],r[o]);break;case 18:i.addEntity(r[o-6],r[o-4]),i.addAttributes(r[o-6],r[o-1]);break;case 19:i.addEntity(r[o-8],r[o-6]),i.addAttributes(r[o-8],r[o-1]),i.setClass([r[o-8]],r[o-3]);break;case 20:i.addEntity(r[o-5],r[o-3]);break;case 21:i.addEntity(r[o-7],r[o-5]),i.setClass([r[o-7]],r[o-2]);break;case 22:i.addEntity(r[o-3],r[o-1]);break;case 23:i.addEntity(r[o-5],r[o-3]),i.setClass([r[o-5]],r[o]);break;case 24:case 25:this.$=r[o].trim(),i.setAccTitle(this.$);break;case 26:case 27:this.$=r[o].trim(),i.setAccDescription(this.$);break;case 32:i.setDirection("TB");break;case 33:i.setDirection("BT");break;case 34:i.setDirection("RL");break;case 35:i.setDirection("LR");break;case 36:this.$=r[o-3],i.addClass(r[o-2],r[o-1]);break;case 37:case 38:case 59:case 67:case 43:this.$=[r[o]];break;case 39:case 40:this.$=r[o-2].concat([r[o]]);break;case 41:this.$=r[o-2],i.setClass(r[o-1],r[o]);break;case 42:this.$=r[o-3],i.addCssStyles(r[o-2],r[o-1]);break;case 44:case 68:r[o-2].push(r[o]),this.$=r[o-2];break;case 46:this.$=r[o-1]+r[o];break;case 54:case 79:case 80:case 70:this.$=r[o].replace(/"/g,"");break;case 60:r[o].push(r[o-1]),this.$=r[o];break;case 61:this.$={type:r[o-1],name:r[o]};break;case 62:this.$={type:r[o-2],name:r[o-1],keys:r[o]};break;case 63:this.$={type:r[o-2],name:r[o-1],comment:r[o]};break;case 64:this.$={type:r[o-3],name:r[o-2],keys:r[o-1],comment:r[o]};break;case 71:this.$={cardA:r[o],relType:r[o-1],cardB:r[o-2]};break;case 72:this.$=i.Cardinality.ZERO_OR_ONE;break;case 73:this.$=i.Cardinality.ZERO_OR_MORE;break;case 74:this.$=i.Cardinality.ONE_OR_MORE;break;case 75:this.$=i.Cardinality.ONLY_ONE;break;case 76:this.$=i.Cardinality.MD_PARENT;break;case 77:this.$=i.Identification.NON_IDENTIFYING;break;case 78:this.$=i.Identification.IDENTIFYING}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:s,24:i,26:n,28:r,29:14,30:15,31:16,32:17,33:a,34:o,35:l,36:h,37:u,40:d,43:y,44:p,48:_,50:g,51:b,52:m},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:30,11:9,22:s,24:i,26:n,28:r,29:14,30:15,31:16,32:17,33:a,34:o,35:l,36:h,37:u,40:d,43:y,44:p,48:_,50:g,51:b,52:m},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:31,63:35,15:[1,32],17:[1,33],20:[1,34],65:f,66:E,67:k,68:T,69:O}),{23:[1,41]},{25:[1,42]},{27:[1,43]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(S,[2,54]),t(S,[2,55]),t(S,[2,56]),t(S,[2,57]),t(S,[2,58]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:44,40:A,41:N},{16:47,40:A,41:N},{16:48,40:A,41:N},t(e,[2,4]),{11:49,40:d,48:_,50:g,51:b,52:m},{16:50,40:A,41:N},{18:51,19:[1,52],53:53,54:54,58:R},{11:56,40:d,48:_,50:g,51:b,52:m},{64:57,70:[1,58],71:[1,59]},t(I,[2,72]),t(I,[2,73]),t(I,[2,74]),t(I,[2,75]),t(I,[2,76]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:C,38:60,41:$,42:x,45:62,46:63,48:D,49:v},t(w,[2,37]),t(w,[2,38]),{16:68,40:A,41:N,42:x},{13:C,38:69,41:$,42:x,45:62,46:63,48:D,49:v},{13:[1,70],15:[1,71]},t(e,[2,17],{63:35,12:72,17:[1,73],42:x,65:f,66:E,67:k,68:T,69:O}),{19:[1,74]},t(e,[2,14]),{18:75,19:[2,59],53:53,54:54,58:R},{55:76,58:[1,77]},{58:[2,65]},{21:[1,78]},{63:79,65:f,66:E,67:k,68:T,69:O},t(L,[2,77]),t(L,[2,78]),{6:K,10:M,39:80,42:B,47:F},{40:[1,85],41:[1,86]},t(Y,[2,43],{46:87,13:C,41:$,48:D,49:v}),t(P,[2,45]),t(P,[2,50]),t(P,[2,51]),t(P,[2,52]),t(P,[2,53]),t(e,[2,41],{42:x}),{6:K,10:M,39:88,42:B,47:F},{14:89,40:z,50:G,72:U},{16:93,40:A,41:N},{11:94,40:d,48:_,50:g,51:b,52:m},{18:95,19:[1,96],53:53,54:54,58:R},t(e,[2,12]),{19:[2,60]},t(Z,[2,61],{56:97,57:98,59:99,61:W,62:j}),t([19,58,61,62],[2,66]),t(e,[2,22],{15:[1,103],17:[1,102]}),t([40,48,50,51,52],[2,71]),t(e,[2,36]),{13:C,41:$,45:104,46:63,48:D,49:v},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(w,[2,39]),t(w,[2,40]),t(P,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,79]),t(e,[2,80]),t(e,[2,81]),{13:[1,105],42:x},{13:[1,107],15:[1,106]},{19:[1,108]},t(e,[2,15]),t(Z,[2,62],{57:109,60:[1,110],62:j}),t(Z,[2,63]),t(X,[2,67]),t(Z,[2,70]),t(X,[2,69]),{18:111,19:[1,112],53:53,54:54,58:R},{16:113,40:A,41:N},t(Y,[2,44],{46:87,13:C,41:$,48:D,49:v}),{14:114,40:z,50:G,72:U},{16:115,40:A,41:N},{14:116,40:z,50:G,72:U},t(e,[2,13]),t(Z,[2,64]),{59:117,61:W},{19:[1,118]},t(e,[2,20]),t(e,[2,23],{17:[1,119],42:x}),t(e,[2,11]),{13:[1,120],42:x},t(e,[2,10]),t(X,[2,68]),t(e,[2,18]),{18:121,19:[1,122],53:53,54:54,58:R},{14:123,40:z,50:G,72:U},{19:[1,124]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{55:[2,65],75:[2,60]},parseError:(0,c.K2)(function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)},"parseError"),parse:(0,c.K2)(function(t){var e=this,s=[0],i=[],n=[null],r=[],a=this.table,o="",l=0,h=0,u=0,d=r.slice.call(arguments,1),y=Object.create(this.lexer),p={yy:{}};for(var _ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_)&&(p.yy[_]=this.yy[_]);y.setInput(t,p.yy),p.yy.lexer=y,p.yy.parser=this,void 0===y.yylloc&&(y.yylloc={});var g=y.yylloc;r.push(g);var b=y.options&&y.options.ranges;function m(){var t;return"number"!=typeof(t=i.pop()||y.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,c.K2)(function(t){s.length=s.length-2*t,n.length=n.length-t,r.length=r.length-t},"popStack"),(0,c.K2)(m,"lex");for(var f,E,k,T,O,S,A,N,R,I={};;){if(k=s[s.length-1],this.defaultActions[k]?T=this.defaultActions[k]:(null==f&&(f=m()),T=a[k]&&a[k][f]),void 0===T||!T.length||!T[0]){var C="";for(S in R=[],a[k])this.terminals_[S]&&S>2&&R.push("'"+this.terminals_[S]+"'");C=y.showPosition?"Parse error on line "+(l+1)+":\n"+y.showPosition()+"\nExpecting "+R.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(C,{text:y.match,token:this.terminals_[f]||f,line:y.yylineno,loc:g,expected:R})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+f);switch(T[0]){case 1:s.push(f),n.push(y.yytext),r.push(y.yylloc),s.push(T[1]),f=null,E?(f=E,E=null):(h=y.yyleng,o=y.yytext,l=y.yylineno,g=y.yylloc,u>0&&u--);break;case 2:if(A=this.productions_[T[1]][1],I.$=n[n.length-A],I._$={first_line:r[r.length-(A||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(A||1)].first_column,last_column:r[r.length-1].last_column},b&&(I._$.range=[r[r.length-(A||1)].range[0],r[r.length-1].range[1]]),void 0!==(O=this.performAction.apply(I,[o,h,l,p.yy,T[1],n,r].concat(d))))return O;A&&(s=s.slice(0,-1*A*2),n=n.slice(0,-1*A),r=r.slice(0,-1*A)),s.push(this.productions_[T[1]][0]),n.push(I.$),r.push(I._$),N=a[s[s.length-2]][s[s.length-1]],s.push(N);break;case 3:return!0}}return!0},"parse")},Q=function(){return{EOF:1,parseError:(0,c.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,c.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,c.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,c.K2)(function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,c.K2)(function(){return this._more=!0,this},"more"),reject:(0,c.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,c.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,c.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,c.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,c.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,c.K2)(function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1},"test_match"),next:(0,c.K2)(function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;r<n.length;r++)if((s=this._input.match(this.rules[n[r]]))&&(!e||s[0].length>e[0].length)){if(e=s,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,c.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,c.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,c.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,c.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,c.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,c.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,c.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,c.K2)(function(t,e,s,i){switch(s){case 0:return this.begin("acc_title"),24;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),26;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:case 23:case 28:case 35:break;case 13:return 8;case 14:return 50;case 15:return 72;case 16:return 4;case 17:return this.begin("block"),17;case 18:case 19:case 38:return 49;case 20:case 37:return 42;case 21:return 15;case 22:case 36:return 13;case 24:return 61;case 25:case 26:return 58;case 27:return 62;case 29:return this.popState(),19;case 30:case 77:return e.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;case 34:return this.popState(),10;case 39:return this.begin("style"),37;case 40:return 43;case 41:case 45:case 46:case 64:return 65;case 42:case 43:case 44:case 52:case 54:case 66:return 67;case 47:case 48:case 49:case 50:case 51:case 53:case 65:return 66;case 55:case 56:case 58:case 59:case 60:case 63:return 68;case 57:return 51;case 61:return 52;case 62:return 48;case 67:return 69;case 68:case 71:case 72:case 73:return 70;case 69:case 70:return 71;case 74:return 41;case 75:return 47;case 76:return 40;case 78:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:[0-9]+\.[0-9]+)/i,/^(?:1(?=\s+[A-Za-z_"']))/i,/^(?:1(?=\s+[0-9]))/i,/^(?:1(?=(--|\.\.|\.-|-\.)))/i,/^(?:1\b)/i,/^(?:[0-9]+)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:u(?=[\.\-\|]))/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*|\.)+)/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,74,75],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,76,77,78],inclusive:!0}}}}();function q(){this.yy={}}return V.lexer=Q,(0,c.K2)(q,"Parser"),q.prototype=V,V.Parser=q,new q}();d.parser=d;var y=d,p=class{constructor(){this.entities=new Map,this.relationships=[],this.classes=new Map,this.direction="TB",this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},this.setAccTitle=o.SV,this.getAccTitle=o.iN,this.setAccDescription=o.EI,this.getAccDescription=o.m7,this.setDiagramTitle=o.ke,this.getDiagramTitle=o.ab,this.getConfig=(0,c.K2)(()=>(0,o.D7)().er,"getConfig"),this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{(0,c.K2)(this,"ErDB")}addEntity(t,e=""){return this.entities.has(t)?!this.entities.get(t)?.alias&&e&&(this.entities.get(t).alias=e,c.Rm.info(`Add alias '${e}' to entity '${t}'`)):(this.entities.set(t,{id:`entity-${t}-${this.entities.size}`,label:t,attributes:[],alias:e,shape:"erBox",look:(0,o.D7)().look??"default",cssClasses:"default",cssStyles:[],labelType:"markdown"}),c.Rm.info("Added new entity :",t)),this.entities.get(t)}getEntity(t){return this.entities.get(t)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(t,e){const s=this.addEntity(t);let i;for(i=e.length-1;i>=0;i--)e[i].keys||(e[i].keys=[]),e[i].comment||(e[i].comment=""),s.attributes.push(e[i]),c.Rm.debug("Added attribute ",e[i].name)}addRelationship(t,e,s,i){const n=this.entities.get(t),r=this.entities.get(s);if(!n||!r)return;const a={entityA:n.id,roleA:e,entityB:r.id,relSpec:i};this.relationships.push(a),c.Rm.debug("Added new relationship :",a)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(t){this.direction=t}getCompiledStyles(t){let e=[];for(const s of t){const t=this.classes.get(s);t?.styles&&(e=[...e,...t.styles??[]].map(t=>t.trim())),t?.textStyles&&(e=[...e,...t.textStyles??[]].map(t=>t.trim()))}return e}addCssStyles(t,e){for(const s of t){const t=this.entities.get(s);if(!e||!t)return;for(const s of e)t.cssStyles.push(s)}}addClass(t,e){t.forEach(t=>{let s=this.classes.get(t);void 0===s&&(s={id:t,styles:[],textStyles:[]},this.classes.set(t,s)),e&&e.forEach(function(t){if(/color/.exec(t)){const e=t.replace("fill","bgFill");s.textStyles.push(e)}s.styles.push(t)})})}setClass(t,e){for(const s of t){const t=this.entities.get(s);if(t)for(const s of e)t.cssClasses+=" "+s}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],(0,o.IU)()}getData(){const t=[],e=[],s=(0,o.D7)();let i=0;for(const r of this.entities.keys()){const e=this.entities.get(r);e&&(e.cssCompiledStyles=this.getCompiledStyles(e.cssClasses.split(" ")),e.colorIndex=i++,t.push(e))}let n=0;for(const r of this.relationships){const t={id:(0,a.rY)(r.entityA,r.entityB,{prefix:"id",counter:n++}),type:"normal",curve:"basis",start:r.entityA,end:r.entityB,label:r.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:r.relSpec.cardB.toLowerCase(),arrowTypeEnd:r.relSpec.cardA.toLowerCase(),pattern:"IDENTIFYING"==r.relSpec.relType?"solid":"dashed",look:s.look,labelType:"markdown"};e.push(t)}return{nodes:t,edges:e,other:{},config:s,direction:"TB"}}},_={};(0,c.VA)(_,{draw:()=>g});var g=(0,c.K2)(async function(t,e,s,h){c.Rm.info("REF0:"),c.Rm.info("Drawing er diagram (unified)",e);const{securityLevel:u,er:d,layout:y}=(0,o.D7)(),p=h.db.getData(),_=(0,i.A)(e,u);p.type=h.type,p.layoutAlgorithm=(0,r.q7)(y),p.config.flowchart.nodeSpacing=d?.nodeSpacing||140,p.config.flowchart.rankSpacing=d?.rankSpacing||80,p.direction=h.db.getDirection();const{config:g}=p,{look:b}=g;p.markers="neo"===b?["only_one_neo","zero_or_one_neo","one_or_more_neo","zero_or_more_neo"]:["only_one","zero_or_one","one_or_more","zero_or_more"],p.diagramId=e,await(0,r.XX)(p,_),"elk"===p.layoutAlgorithm&&_.select(".edges").lower();const m=_.selectAll('[id*="-background"]');Array.from(m).length>0&&m.each(function(){const t=(0,l.Ltv)(this),e=t.attr("id").replace("-background",""),s=_.select(`#${CSS.escape(e)}`);if(!s.empty()){const e=s.attr("transform");t.attr("transform",e)}});a._K.insertTitle(_,"erDiagramTitleText",d?.titleTopMargin??25,h.db.getDiagramTitle()),(0,n.P)(_,8,"erDiagram",d?.useMaxWidth??!0)},"draw"),b=(0,c.K2)((t,e)=>{const s=u.A,i=s(t,"r"),n=s(t,"g"),r=s(t,"b");return h.A(i,n,r,e)},"fade"),m=new Set(["redux-color","redux-dark-color"]),f=(0,c.K2)(t=>{const{theme:e,look:s,bkgColorArray:i,borderColorArray:n}=t;if(!m.has(e))return"";const r=i?.length>0;let a="";for(let o=0;o<t.THEME_COLOR_LIMIT;o++)a+=`\n\n [data-look="${s}"][data-color-id="color-${o}"].node path {\n stroke: ${n[o]};\n ${r?`fill: ${i[o]};`:""}\n }\n\n [data-look="${s}"][data-color-id="color-${o}"].node rect {\n stroke: ${n[o]};\n ${r?`fill: ${i[o]};`:""}\n }\n `;return a},"genColor"),E=(0,c.K2)(t=>{const{look:e,theme:s,erEdgeLabelBackground:i,strokeWidth:n}=t;return`\n ${f(t)}\n .entityBox {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${t.tertiaryColor};\n opacity: 0.7;\n background-color: ${t.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .labelBkg {\n background-color: ${m.has(s)&&i?i:b(t.tertiaryColor,.5)};\n }\n\n .edgeLabel {\n background-color: ${m.has(s)&&i?i:t.edgeLabelBackground};\n }\n .edgeLabel .label rect {\n fill: ${m.has(s)&&i?i:t.edgeLabelBackground};\n }\n .edgeLabel .label text {\n fill: ${t.textColor};\n }\n\n .edgeLabel .label {\n fill: ${t.nodeBorder};\n font-size: 14px;\n }\n\n .label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .edge-pattern-dashed {\n stroke-dasharray: 8,8;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon\n {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: ${"neo"===e?n:"1px"};\n }\n\n .relationshipLine {\n stroke: ${t.lineColor};\n stroke-width: ${"neo"===e?n:"1px"};\n fill: none;\n }\n\n .marker {\n fill: none !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n }\n [data-look=neo].labelBkg {\n background-color: ${b(t.tertiaryColor,.5)};\n }\n`},"getStyles"),k={parser:y,get db(){return new p},renderer:_,styles:E}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[1127],{1127(e,a,i){i.d(a,{createPieServices:()=>p.f});var p=i(6886);i(3228)}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[4390],{5202(e,n,t){t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"api/functions/useInjectSideEffect","title":"useInjectSideEffect()","description":"Parameters","source":"@site/docs/api/functions/useInjectSideEffect.md","sourceDirName":"api/functions","slug":"/api/functions/useInjectSideEffect","permalink":"/app-sdk/api/functions/useInjectSideEffect","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/functions/useInjectSideEffect.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"useInjectSaga()","permalink":"/app-sdk/api/functions/useInjectSaga"},"next":{"title":"useMediaQueryList()","permalink":"/app-sdk/api/functions/useMediaQueryList"}}');var s=t(6070),r=t(5589);const c={},a="useInjectSideEffect()",d={},l=[{value:"Parameters",id:"parameters",level:2},{value:"listener",id:"listener",level:3},{value:"payload",id:"payload",level:4},{value:"type",id:"type",level:4},{value:"Returns",id:"returns",level:2}];function o(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"useinjectsideeffect",children:"useInjectSideEffect()"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ts",children:"function useInjectSideEffect(listener: {\n payload: unknown;\n type: string;\n}): void;\n"})}),"\n",(0,s.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsx)(n.h3,{id:"listener",children:"listener"}),"\n",(0,s.jsx)(n.h4,{id:"payload",children:"payload"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"unknown"})}),"\n",(0,s.jsx)(n.h4,{id:"type",children:"type"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"string"})}),"\n",(0,s.jsx)(n.h2,{id:"returns",children:"Returns"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"void"})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},5589(e,n,t){t.d(n,{R:()=>c,x:()=>a});var i=t(758);const s={},r=i.createContext(s);function c(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[1298],{2626(e,t,n){n.d(t,{P:()=>o});var i=n(3316),s=n(7970),o=(0,s.K2)((e,t,n,o)=>{e.attr("class",n);const{width:c,height:l,x:h,y:d}=r(e,t);(0,i.a$)(e,l,c,o);const g=a(h,d,c,l,t);e.attr("viewBox",g),s.Rm.debug(`viewBox configured: ${g} with padding: ${t}`)},"setupViewPortForSVG"),r=(0,s.K2)((e,t)=>{const n=e.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:n.width+2*t,height:n.height+2*t,x:n.x,y:n.y}},"calculateDimensionsWithPadding"),a=(0,s.K2)((e,t,n,i,s)=>`${e-s} ${t-s} ${n} ${i}`,"createViewBox")},5934(e,t,n){n.d(t,{A:()=>o});var i=n(7970),s=n(7012),o=(0,i.K2)((e,t)=>{let n;"sandbox"===t&&(n=(0,s.Ltv)("#i"+e));return("sandbox"===t?(0,s.Ltv)(n.nodes()[0].contentDocument.body):(0,s.Ltv)("body")).select(`[id="${e}"]`)},"getDiagramElement")},1298(e,t,n){n.d(t,{diagram:()=>x});var i=n(5934),s=n(2626),o=n(7019),r=(n(2452),n(2993),n(3641),n(566),n(9478),n(2864),n(1546),n(3316)),a=n(7970);const c=new Uint8Array(16);const l=[];for(let L=0;L<256;++L)l.push((L+256).toString(16).slice(1));function h(e,t=0){return(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase()}const d=function(e,t,n){return t||e||!crypto.randomUUID?function(e,t,n){e=e||{};const i=e.random??e.rng?.()??crypto.getRandomValues(c);if(i.length<16)throw new Error("Random bytes length must be >= 16");if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t){if((n=n||0)<0||n+16>t.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[n+e]=i[e];return t}return h(i)}(e,t,n):crypto.randomUUID()};var g=n(3212),u=n(8480),p=n(9515),y=function(){var e=(0,a.K2)(function(e,t,n,i){for(n=n||{},i=e.length;i--;n[e[i]]=t);return n},"o"),t=[1,4],n=[1,13],i=[1,12],s=[1,15],o=[1,16],r=[1,20],c=[1,19],l=[6,7,8],h=[1,26],d=[1,24],g=[1,25],u=[6,7,11],p=[1,6,13,15,16,19,22],y=[1,33],m=[1,34],f=[1,6,7,11,13,15,16,19,22],_={trace:(0,a.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:(0,a.K2)(function(e,t,n,i,s,o,r){var a=o.length-1;switch(s){case 6:case 7:return i;case 8:i.getLogger().trace("Stop NL ");break;case 9:i.getLogger().trace("Stop EOF ");break;case 11:i.getLogger().trace("Stop NL2 ");break;case 12:i.getLogger().trace("Stop EOF2 ");break;case 15:i.getLogger().info("Node: ",o[a].id),i.addNode(o[a-1].length,o[a].id,o[a].descr,o[a].type);break;case 16:i.getLogger().trace("Icon: ",o[a]),i.decorateNode({icon:o[a]});break;case 17:case 21:i.decorateNode({class:o[a]});break;case 18:i.getLogger().trace("SPACELIST");break;case 19:i.getLogger().trace("Node: ",o[a].id),i.addNode(0,o[a].id,o[a].descr,o[a].type);break;case 20:i.decorateNode({icon:o[a]});break;case 25:i.getLogger().trace("node found ..",o[a-2]),this.$={id:o[a-1],descr:o[a-1],type:i.getType(o[a-2],o[a])};break;case 26:this.$={id:o[a],descr:o[a],type:i.nodeType.DEFAULT};break;case 27:i.getLogger().trace("node found ..",o[a-3]),this.$={id:o[a-3],descr:o[a-1],type:i.getType(o[a-2],o[a])}}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:t},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:t},{6:n,7:[1,10],9:9,12:11,13:i,14:14,15:s,16:o,17:17,18:18,19:r,22:c},e(l,[2,3]),{1:[2,2]},e(l,[2,4]),e(l,[2,5]),{1:[2,6],6:n,12:21,13:i,14:14,15:s,16:o,17:17,18:18,19:r,22:c},{6:n,9:22,12:11,13:i,14:14,15:s,16:o,17:17,18:18,19:r,22:c},{6:h,7:d,10:23,11:g},e(u,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:r,22:c}),e(u,[2,18]),e(u,[2,19]),e(u,[2,20]),e(u,[2,21]),e(u,[2,23]),e(u,[2,24]),e(u,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:d,10:32,11:g},{1:[2,7],6:n,12:21,13:i,14:14,15:s,16:o,17:17,18:18,19:r,22:c},e(p,[2,14],{7:y,11:m}),e(f,[2,8]),e(f,[2,9]),e(f,[2,10]),e(u,[2,15]),e(u,[2,16]),e(u,[2,17]),{20:[1,35]},{21:[1,36]},e(p,[2,13],{7:y,11:m}),e(f,[2,11]),e(f,[2,12]),{21:[1,37]},e(u,[2,25]),e(u,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:(0,a.K2)(function(e,t){if(!t.recoverable){var n=new Error(e);throw n.hash=t,n}this.trace(e)},"parseError"),parse:(0,a.K2)(function(e){var t=this,n=[0],i=[],s=[null],o=[],r=this.table,c="",l=0,h=0,d=0,g=o.slice.call(arguments,1),u=Object.create(this.lexer),p={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(p.yy[y]=this.yy[y]);u.setInput(e,p.yy),p.yy.lexer=u,p.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var m=u.yylloc;o.push(m);var f=u.options&&u.options.ranges;function _(){var e;return"number"!=typeof(e=i.pop()||u.lex()||1)&&(e instanceof Array&&(e=(i=e).pop()),e=t.symbols_[e]||e),e}"function"==typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,a.K2)(function(e){n.length=n.length-2*e,s.length=s.length-e,o.length=o.length-e},"popStack"),(0,a.K2)(_,"lex");for(var b,k,E,S,x,L,N,D,$,I={};;){if(E=n[n.length-1],this.defaultActions[E]?S=this.defaultActions[E]:(null==b&&(b=_()),S=r[E]&&r[E][b]),void 0===S||!S.length||!S[0]){var T="";for(L in $=[],r[E])this.terminals_[L]&&L>2&&$.push("'"+this.terminals_[L]+"'");T=u.showPosition?"Parse error on line "+(l+1)+":\n"+u.showPosition()+"\nExpecting "+$.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(T,{text:u.match,token:this.terminals_[b]||b,line:u.yylineno,loc:m,expected:$})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+E+", token: "+b);switch(S[0]){case 1:n.push(b),s.push(u.yytext),o.push(u.yylloc),n.push(S[1]),b=null,k?(b=k,k=null):(h=u.yyleng,c=u.yytext,l=u.yylineno,m=u.yylloc,d>0&&d--);break;case 2:if(N=this.productions_[S[1]][1],I.$=s[s.length-N],I._$={first_line:o[o.length-(N||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(N||1)].first_column,last_column:o[o.length-1].last_column},f&&(I._$.range=[o[o.length-(N||1)].range[0],o[o.length-1].range[1]]),void 0!==(x=this.performAction.apply(I,[c,h,l,p.yy,S[1],s,o].concat(g))))return x;N&&(n=n.slice(0,-1*N*2),s=s.slice(0,-1*N),o=o.slice(0,-1*N)),n.push(this.productions_[S[1]][0]),s.push(I.$),o.push(I._$),D=r[n[n.length-2]][n[n.length-1]],n.push(D);break;case 3:return!0}}return!0},"parse")},b=function(){return{EOF:1,parseError:(0,a.K2)(function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},"parseError"),setInput:(0,a.K2)(function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,a.K2)(function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},"input"),unput:(0,a.K2)(function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},"unput"),more:(0,a.K2)(function(){return this._more=!0,this},"more"),reject:(0,a.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,a.K2)(function(e){this.unput(this.match.slice(e))},"less"),pastInput:(0,a.K2)(function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,a.K2)(function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,a.K2)(function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},"showPosition"),test_match:(0,a.K2)(function(e,t){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var o in s)this[o]=s[o];return!1}return!1},"test_match"),next:(0,a.K2)(function(){if(this.done)return this.EOF;var e,t,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),o=0;o<s.length;o++)if((n=this._input.match(this.rules[s[o]]))&&(!t||n[0].length>t[0].length)){if(t=n,i=o,this.options.backtrack_lexer){if(!1!==(e=this.test_match(n,s[o])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,s[i]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,a.K2)(function(){var e=this.next();return e||this.lex()},"lex"),begin:(0,a.K2)(function(e){this.conditionStack.push(e)},"begin"),popState:(0,a.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,a.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,a.K2)(function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"},"topState"),pushState:(0,a.K2)(function(e){this.begin(e)},"pushState"),stateStackSize:(0,a.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,a.K2)(function(e,t,n,i){switch(n){case 0:return e.getLogger().trace("Found comment",t.yytext),6;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;case 4:case 23:case 26:this.popState();break;case 5:e.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return e.getLogger().trace("SPACELINE"),6;case 7:return 7;case 8:return 15;case 9:e.getLogger().trace("end icon"),this.popState();break;case 10:return e.getLogger().trace("Exploding node"),this.begin("NODE"),19;case 11:return e.getLogger().trace("Cloud"),this.begin("NODE"),19;case 12:return e.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;case 13:return e.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;case 14:case 15:case 16:case 17:return this.begin("NODE"),19;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 24:e.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return e.getLogger().trace("description:",t.yytext),"NODE_DESCR";case 27:return this.popState(),e.getLogger().trace("node end ))"),"NODE_DEND";case 28:return this.popState(),e.getLogger().trace("node end )"),"NODE_DEND";case 29:return this.popState(),e.getLogger().trace("node end ...",t.yytext),"NODE_DEND";case 30:case 33:case 34:return this.popState(),e.getLogger().trace("node end (("),"NODE_DEND";case 31:case 32:return this.popState(),e.getLogger().trace("node end (-"),"NODE_DEND";case 35:case 36:return e.getLogger().trace("Long description:",t.yytext),20}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}}}();function k(){this.yy={}}return _.lexer=b,(0,a.K2)(k,"Parser"),k.prototype=_,_.Parser=k,new k}();y.parser=y;var m=y,f={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},_=class{constructor(){this.nodes=[],this.count=0,this.elements={},this.getLogger=this.getLogger.bind(this),this.nodeType=f,this.clear(),this.getType=this.getType.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{(0,a.K2)(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={},this.baseLevel=void 0}getParent(e){for(let t=this.nodes.length-1;t>=0;t--)if(this.nodes[t].level<e)return this.nodes[t];return null}getMindmap(){return this.nodes.length>0?this.nodes[0]:null}addNode(e,t,n,i){a.Rm.info("addNode",e,t,n,i);let s=!1;0===this.nodes.length?(this.baseLevel=e,e=0,s=!0):void 0!==this.baseLevel&&(e-=this.baseLevel,s=!1);const o=(0,r.D7)();let c=o.mindmap?.padding??r.UI.mindmap.padding;switch(i){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:c*=2}const l={id:this.count++,nodeId:(0,r.jZ)(t,o),level:e,descr:(0,r.jZ)(n,o),type:i,children:[],width:o.mindmap?.maxNodeWidth??r.UI.mindmap.maxNodeWidth,padding:c,isRoot:s},h=this.getParent(e);if(h)h.children.push(l),this.nodes.push(l);else{if(!s)throw new Error(`There can be only one root. No parent could be found for ("${l.descr}")`);this.nodes.push(l)}}getType(e,t){switch(a.Rm.debug("In get type",e,t),e){case"[":return this.nodeType.RECT;case"(":return")"===t?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,t){this.elements[e]=t}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;const t=(0,r.D7)(),n=this.nodes[this.nodes.length-1];e.icon&&(n.icon=(0,r.jZ)(e.icon,t)),e.class&&(n.class=(0,r.jZ)(e.class,t))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}assignSections(e,t){if(0===e.level?e.section=void 0:e.section=t,e.children)for(const[n,i]of e.children.entries()){const s=0===e.level?n%11:t;this.assignSections(i,s)}}flattenNodes(e,t){const n=(0,r.D7)(),i=["mindmap-node"];!0===e.isRoot?i.push("section-root","section--1"):void 0!==e.section&&i.push(`section-${e.section}`),e.class&&i.push(e.class);const s=i.join(" "),o=(0,a.K2)(e=>{const t=(n.theme?.toLowerCase()??"").includes("redux");switch(e){case f.CIRCLE:return"mindmapCircle";case f.RECT:return"rect";case f.ROUNDED_RECT:return"rounded";case f.CLOUD:return"cloud";case f.BANG:return"bang";case f.HEXAGON:return"hexagon";case f.DEFAULT:return t?"rounded":"defaultMindmapNode";default:return"rect"}},"getShapeFromType"),c={id:e.id.toString(),domId:"node_"+e.id.toString(),label:e.descr,labelType:"markdown",isGroup:!1,shape:o(e.type),width:e.width,height:e.height??0,padding:e.padding,cssClasses:s,cssStyles:[],look:n.look,icon:e.icon,x:e.x,y:e.y,level:e.level,nodeId:e.nodeId,type:e.type,section:e.section};if(t.push(c),e.children)for(const r of e.children)this.flattenNodes(r,t)}generateEdges(e,t){if(!e.children)return;const n=(0,r.D7)();for(const i of e.children){let s="edge";void 0!==i.section&&(s+=` section-edge-${i.section}`);s+=` edge-depth-${e.level+1}`;const o={id:`edge_${e.id}_${i.id}`,start:e.id.toString(),end:i.id.toString(),type:"normal",curve:"basis",thickness:"normal",look:n.look,classes:s,depth:e.level,section:i.section};t.push(o),this.generateEdges(i,t)}}getData(){const e=this.getMindmap(),t=(0,r.D7)(),n=t;if(void 0!==(0,r.TM)().layout||(n.layout="cose-bilkent"),!e)return{nodes:[],edges:[],config:n};a.Rm.debug("getData: mindmapRoot",e,t),this.assignSections(e);const i=[],s=[];this.flattenNodes(e,i),this.generateEdges(e,s),a.Rm.debug(`getData: processed ${i.length} nodes and ${s.length} edges`);const o=new Map;for(const r of i)o.set(r.id,{shape:r.shape,width:r.width,height:r.height,padding:r.padding});return{nodes:i,edges:s,config:n,rootNode:e,markers:["point"],direction:"TB",nodeSpacing:50,rankSpacing:50,shapes:Object.fromEntries(o),type:"mindmap",diagramId:"mindmap-"+d()}}getLogger(){return a.Rm}},b={draw:(0,a.K2)(async(e,t,n,c)=>{a.Rm.debug("Rendering mindmap diagram\n"+e);const l=c.db,h=l.getData(),d=(0,i.A)(t,h.config.securityLevel);h.type=c.type,h.layoutAlgorithm=(0,o.q7)(h.config.layout,{fallback:"cose-bilkent"}),h.diagramId=t;if(!l.getMindmap())return;h.nodes.forEach(e=>{"rounded"===e.shape?(e.radius=15,e.taper=15,e.stroke="none",e.width=0,e.padding=15):"circle"===e.shape?e.padding=10:"rect"===e.shape?(e.width=0,e.padding=10):"hexagon"===e.shape&&(e.width=0,e.height=0)}),await(0,o.XX)(h,d);const{themeVariables:g}=(0,r.zj)(),{useGradient:u,gradientStart:p,gradientStop:y}=g;if(u&&p&&y){const e=d.attr("id"),t=d.append("defs").append("linearGradient").attr("id",`${e}-gradient`).attr("gradientUnits","objectBoundingBox").attr("x1","0%").attr("y1","0%").attr("x2","100%").attr("y2","0%");t.append("stop").attr("offset","0%").attr("stop-color",p).attr("stop-opacity",1),t.append("stop").attr("offset","100%").attr("stop-color",y).attr("stop-opacity",1)}(0,s.P)(d,h.config.mindmap?.padding??r.UI.mindmap.padding,"mindmapDiagram",h.config.mindmap?.useMaxWidth??r.UI.mindmap.useMaxWidth)},"draw")},k=(0,a.K2)(e=>{const{theme:t,look:n}=e;let i="";for(let s=0;s<e.THEME_COLOR_LIMIT;s++)e["lineColor"+s]=e["lineColor"+s]||e["cScaleInv"+s],(0,g.A)(e["lineColor"+s])?e["lineColor"+s]=(0,u.A)(e["lineColor"+s],20):e["lineColor"+s]=(0,p.A)(e["lineColor"+s],20);for(let s=0;s<e.THEME_COLOR_LIMIT;s++){const o=""+("neo"===n?Math.max(10-2*(s-1),2):17-3*s);i+=`\n .section-${s-1} rect, .section-${s-1} path, .section-${s-1} circle, .section-${s-1} polygon, .section-${s-1} path {\n fill: ${e["cScale"+s]};\n }\n .section-${s-1} text {\n fill: ${e["cScaleLabel"+s]};\n }\n .section-${s-1} span {\n color: ${e["cScaleLabel"+s]};\n }\n .node-icon-${s-1} {\n font-size: 40px;\n color: ${e["cScaleLabel"+s]};\n }\n .section-edge-${s-1}{\n stroke: ${e["cScale"+s]};\n }\n .edge-depth-${s-1}{\n stroke-width: ${o};\n }\n .section-${s-1} line {\n stroke: ${e["cScaleInv"+s]} ;\n stroke-width: 3;\n }\n\n .disabled, .disabled circle, .disabled text {\n fill: lightgray;\n }\n .disabled text {\n fill: #efefef;\n }\n [data-look="neo"].mindmap-node.section-${s-1} rect, [data-look="neo"].mindmap-node.section-${s-1} path, [data-look="neo"].mindmap-node.section-${s-1} circle, [data-look="neo"].mindmap-node.section-${s-1} polygon {\n fill: ${"redux"===t||"redux-dark"===t||"neutral"===t?e.mainBkg:e["cScale"+s]};\n stroke: ${"redux"===t||"redux-dark"===t?e.nodeBorder:e["cScale"+s]};\n stroke-width: ${e.strokeWidth??2}px;\n }\n [data-look="neo"].section-edge-${s-1}{\n stroke: ${t?.includes("redux")||"neo-dark"===t?e.nodeBorder:e["cScale"+s]};\n }\n [data-look="neo"].mindmap-node.section-${s-1} text {\n fill: ${"redux"===t||"redux-dark"===t?e.nodeBorder:e["cScaleLabel"+("neutral"===t?1:s)]};\n }\n `}return i},"genSections"),E=(0,a.K2)((e,t,n)=>{let i="";for(let s=0;s<e;s++)i+=`\n [data-look="neo"].mindmap-node.section-${s-1} rect, [data-look="neo"].mindmap-node.section-${s-1} path, [data-look="neo"].mindmap-node.section-${s-1} circle, [data-look="neo"].mindmap-node.section-${s-1} polygon {\n stroke: url(${t}-gradient);\n fill: ${n};\n }\n .section-${s-1} line {\n stroke-width: 0;\n }`;return i},"genGradient"),S=(0,a.K2)(e=>{const{theme:t}=e,n=e.svgId,i=e.dropShadow?e.dropShadow.replace("url(#drop-shadow)",`url(${n}-drop-shadow)`):"none";return`\n .edge {\n stroke-width: 3;\n }\n ${k(e)}\n .section-root rect, .section-root path, .section-root circle, .section-root polygon {\n fill: ${e.git0};\n }\n .section-root text {\n fill: ${e.gitBranchLabel0};\n }\n .section-root span {\n color: ${t?.includes("redux")?e.nodeBorder:e.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .mindmap-node-label {\n dy: 1em;\n alignment-baseline: middle;\n text-anchor: middle;\n dominant-baseline: middle;\n text-align: center;\n }\n [data-look="neo"].mindmap-node {\n filter: ${i};\n }\n [data-look="neo"].mindmap-node.section-root rect, [data-look="neo"].mindmap-node.section-root path, [data-look="neo"].mindmap-node.section-root circle, [data-look="neo"].mindmap-node.section-root polygon {\n fill: ${t?.includes("redux")?e.mainBkg:e.git0};\n }\n [data-look="neo"].mindmap-node.section-root .text-inner-tspan {\n fill: ${t?.includes("redux")?e.nodeBorder:e["cScaleLabel"+("neutral"===t?1:0)]};\n }\n ${e.useGradient&&n&&e.mainBkg?E(e.THEME_COLOR_LIMIT,n,e.mainBkg):""}\n`},"getStyles"),x={get db(){return new _},renderer:b,parser:m,styles:S}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(globalThis.webpackChunk_elliemae_pui_app_sdk=globalThis.webpackChunk_elliemae_pui_app_sdk||[]).push([[2666],{7401(e,n,a){a.r(n),a.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"api/variables/Themes","title":"Themes","description":"Type Declaration","source":"@site/docs/api/variables/Themes.md","sourceDirName":"api/variables","slug":"/api/variables/Themes","permalink":"/app-sdk/api/variables/Themes","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-app-sdk.git/docs/api/variables/Themes.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"NavigationPromptActions","permalink":"/app-sdk/api/variables/NavigationPromptActions"},"next":{"title":"VisuallyHidden","permalink":"/app-sdk/api/variables/VisuallyHidden"}}');var i=a(6070),t=a(5589);const r={},l="Themes",o={},c=[{value:"Type Declaration",id:"type-declaration",level:2},{value:"CORP_COOL",id:"corp_cool",level:3},{value:"EM",id:"em",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",pre:"pre",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"themes",children:"Themes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"const Themes: {\n CORP_COOL: string;\n EM: string;\n};\n"})}),"\n",(0,i.jsx)(n.h2,{id:"type-declaration",children:"Type Declaration"}),"\n",(0,i.jsx)(n.h3,{id:"corp_cool",children:"CORP_COOL"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"CORP_COOL: string = 'corpcool';\n"})}),"\n",(0,i.jsx)(n.h3,{id:"em",children:"EM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"EM: string = 'em';\n"})})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5589(e,n,a){a.d(n,{R:()=>r,x:()=>l});var s=a(758);const i={},t=s.createContext(i);function r(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]);
|